Я хотел бы поделиться знаниями о внутренних органах 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())"
если выходные команды, указанные выше, не имеют идентификаторов - эти репозитории не связаны. Из-за свойств hash очень невозможно, чтобы корни случайно были равны. Вы не можете обманывать проверку корней, тщательно создавая хранилища, потому что построение двух хранилищ выглядит следующим образом (с общими частями, но разными корнями):
0 <--- SHA-256-XXX <--- SHA-256-YYY <--- SHA-256-ZZZ
0 <--- SHA-256-YYY <--- SHA-256-ZZZ
невозможно, потому что это означает, что вы обращаетесь к SHA-256, поскольку каждый последующий хэш зависит от предыдущих значений.
Имея эту информацию, я полагаю, что любой разработчик сможет устранить неполадки error: repository is unrelated
.
См. Также Идентификация ртутного хранилища
Спасибо за внимание, хорошего взлома!