Ошибка Mercurial: репозиторий не связан
Я только что начал с Mercurial, у меня есть "центральный" репозиторий на Bitbucket, который я клонировал на одну машину, делал изменения, совершал и толкал. Затем я клонировал от Bitbucket к другой машине, и я толкнул ее. Затем я вернулся к первой машине, сделал изменения и попытался нажать, но получил сообщение об ошибке. Что я делаю не так? Должен ли я вытащить первым? Как я могу разрешить ошибку и нажать? Любая помощь приветствуется!
Даррен.
Ответы
Ответ 1
Репозиторий Mercurial получает свою личность, когда вы делаете в нем первую фиксацию. Когда вы создаете новый репозиторий в Bitbucket, вы создаете пустой репозиторий без идентификатора.
Когда вы клонируете этот репозиторий на машину A и делаете фиксацию и нажимаете ее обратно, вы заклейте репозиторий. Если вы клонировали репозиторий на втором компьютере, прежде чем нажимать с первого, вы можете оказаться в ситуации, о которой вы описываете.
Запустите hg paths
на машине, где вы не можете нажать. Затем создайте отдельный клон репозитория, на котором он будет нажимать. Теперь изучите первый набор изменений в каждом репозитории с помощью
hg log -r 0
Если исходные изменения меняются, тогда у вас есть два несвязанных репозитория, как мы его называем в Mercurial. Затем вы можете экспортировать изменения, которые вы не можете нажимать как патчи, и импортировать их в другой.
Ответ 2
Если вы уверены, что путь push правильный, может быть стоит просто экспортировать ваши изменения в исправления из проблемы репо, снова клонировать из Bitbucket, а затем импортировать патчи в новое репо. Это будет либо просто работать, либо обнаруживать плохую/поврежденную фиксацию.
Ответ 3
Я хотел бы поделиться знаниями о внутренних функциях Mercurial.
Хранилища, не связанные друг с другом, когда они не имеют каких-либо изменений.
Соответствующий фрагмент можно найти в mercurial/treediscovery.py
:
base = list(base)
if base == [nullid]:
if force:
repo.ui.warn(_("warning: repository is unrelated\n"))
else:
raise util.Abort(_("repository is unrelated"))
base
- это список корней общих частей в локальных/удаленных репозиториях.
Вы всегда можете знать, как разные репозитории отличаются:
$ hg in $REMOTE
$ hg out $REMOTE
Вы всегда можете проверять корни обоих (после клонирования как локально):
$ hg -R $ONE log -r "roots(all())"
$ hg -R $TWO log -r "roots(all())"
если вывод из вышеприведенных команд не содержит идентификаторов - эти репозитории не связаны. Из-за свойств хеша очень невозможно, чтобы корни были равны случайным образом. Вы не можете обмануть корни, тщательно обработав репозитории, потому что построение двух репозиториев выглядит так (с общими частями, но с разными корнями):
0 <--- SHA-256-XXX <--- SHA-256-YYY <--- SHA-256-ZZZ
0 <--- SHA-256-YYY <--- SHA-256-ZZZ
невозможно, потому что это означает, что вы отменяете SHA-256, поскольку каждый последующий хеш зависит от предыдущих значений.
Имея эту информацию, я считаю, что любой Devs сможет устранить неполадки error: repository is unrelated
.
См. также Идентификация хранилища Mercurial
Спасибо за внимание, хороший взлом!
Ответ 4
Вы получаете это сообщение, когда пытаетесь нажать в репозиторий, отличный от того, который вы клонировали. Дважды проверьте адрес push или путь default
, если вы просто используете hg push
самостоятельно.
Чтобы проверить путь по умолчанию, вы можете использовать hg showconfig | grep ^paths\.default
(или просто hg showconfig
и искать строку, начинающуюся с paths.default=
).
Ответ 5
Я починил это:
1 - Удалить репо (локальный каталог на вашем компьютере)
2 - клонировать репо в вашей машине