Подтвердить что ты не робот

Ошибка Mercurial: репозиторий не связан

Я только что начал с Mercurial, у меня есть "центральный" репозиторий на Bitbucket, который я клонировал на одну машину, делал изменения, совершал и толкал. Затем я клонировал от Bitbucket к другой машине, и я толкнул ее. Затем я вернулся к первой машине, сделал изменения и попытался нажать, но получил сообщение об ошибке. Что я делаю не так? Должен ли я вытащить первым? Как я могу разрешить ошибку и нажать? Любая помощь приветствуется!

Даррен.

4b9b3361

Ответ 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 - клонировать репо в вашей машине