Mercurial错误:存储库不相关

时间:2011-09-05 22:16:37

标签: mercurial dvcs bitbucket

我刚开始使用Mercurial,我在Bitbucket上有一个'中央'存储库,我将其克隆到一台机器上并进行更改并提交和推送。然后我从Bitbucket克隆到另一台承诺推送的机器,这很好。然后我回到第一台机器,提交了更改并尝试推送,但收到了错误消息。我究竟做错了什么?我应该先拉?如何解决错误并推送?任何帮助表示赞赏!

达伦。

4 个答案:

答案 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=开头的行。