我刚开始使用Mercurial,我在Bitbucket上有一个'中央'存储库,我将其克隆到一台机器上并进行更改并提交和推送。然后我从Bitbucket克隆到另一台承诺推送的机器,这很好。然后我回到第一台机器,提交了更改并尝试推送,但收到了错误消息。我究竟做错了什么?我应该先拉?如何解决错误并推送?任何帮助表示赞赏!
达伦。
答案 0 :(得分:37)
当您在其中进行第一次提交时,Mercurial存储库会获取其标识。在Bitbucket上创建新存储库时,您将创建一个没有标识的空存储库。
当您将此存储库克隆到计算机A并进行提交并将其推回时,您就会对存储库进行标记。如果你已经在推送第一台机器之前克隆了存储库,那么你可以最终处理你所描述的情况。
请在无法推送的机器上运行hg paths
。然后单独克隆它将要推送到的存储库。现在使用
hg log -r 0
如果初始更改集不同,那么您有两个不相关的存储库,我们在Mercurial中调用它。然后,您可以导出无法作为补丁推送的更改,并将其导入另一个。
答案 1 :(得分:3)
如果你非常确定推送路径是正确的,那么将更改导出到问题仓库中的补丁,从Bitbucket再次克隆然后将补丁导入新的仓库可能是值得的。这将只是工作或揭示错误/损坏的提交。
答案 2 :(得分: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())"
如果来自上述命令的输出不共享ID - 那些存储库是不相关的。由于哈希属性,根本不可能意外地相等。您可能不会通过精心制作存储库来欺骗根检查,因为构建两个存储库看起来像这些(具有公共部分但不同的根):
0 <--- SHA-256-XXX <--- SHA-256-YYY <--- SHA-256-ZZZ
0 <--- SHA-256-YYY <--- SHA-256-ZZZ
不可能,因为这意味着您反转SHA-256,因为每个后续哈希都依赖于之前的值。
有了这些信息,我相信任何Dev都能够排除error: repository is unrelated
的问题。
另见Mercurial repository identification
感谢您的关注,良好的黑客攻击!
答案 3 :(得分:0)
当您尝试推送到您克隆的存储库以外的存储库时,会收到此消息。如果您只是单独使用default
,请仔细检查推送的地址或hg push
路径。
要检查默认路径,您可以使用hg showconfig | grep ^paths\.default
(或只是hg showconfig
并查找以paths.default=
开头的行。