如何理解为什么hg import --exact失败

时间:2019-04-12 16:23:19

标签: mercurial

我已经从一个存储库中的一次提交(更改集)创建了一个补丁文件(使用TortoiseHg),并试图将其应用于另一个存储库。

简单地hg import 1059.patch,我得到

  

正在应用1059.patch
  应用于工作目录

(而且我不确定这是什么意思。我问过a separate question。)

但是由于我想确保保留哈希值,因此我使用了hg import 1059.patch --exact,在这种情况下,我得到了

  

应用1059.patch
  中止:补丁已损坏或丢失信息

我该如何调试?我可以获取有关到底出了什么问题的更多信息吗?

2 个答案:

答案 0 :(得分:0)

问题可能是您在一个补丁文件中有多个补丁。

根据this forum post

  

导入每个输入文件执行一次提交,您不能完全保留   一次提交中有[多个]个提交ID。

(Matt Mackall发帖,我相信他是HG的创建者/维护者之一)。

(仅供参考,我搜索了不常见的错误消息“中止:补丁已损坏或丢失信息”,并导致了该帖子。)

答案 1 :(得分:0)

我可以复制这个。在我的情况下,一个import --exact失败了,因为它是一个嫁接,而“额外的”元数据(可以用hg log --debug看到)导致了另一个变更集哈希。专门针对嫁接,使用hg log --debug和以下额外的行来查看元数据:

extra:       source=acdaed39eb57d8bc2efe6a6bf3547bb6d06fe2d5

此数据是mercurial用于计算变更集哈希的输入之一。但是export不提供该信息(至少从5.2.1起)。

还有其他产生“额外”元数据的操作(例如rebase)。

在我看来,这似乎是一个真实的错误-export不提供“额外”数据。当然,如果export学习提供这些数据,则需要教import如何使用额外的数据。

复制步骤:

hg init foo
(
echo "create a few changesets (with a branch) in repo foo"
cd foo
echo 0 > x
hg ci -Am0
echo 1 > x
hg ci -m1
hg up 0
echo 0a > x
hg ci -m0a
)
echo "clone the 3 changesets in foo to foo2"
hg clone -U foo foo2
(
echo "add a couple more changesets to foo, the second of which is a graft"
cd foo
echo 2 > x
hg ci -m2
hg up -r1
hg graft --log 2
echo 0a > x
hg resolve -m x
hg graft --continue
hg export 3 > exp3
hg export 4 > exp4
echo "log of the two new changesets:"
hg log -G --debug -r3:4 | cat
)
(
echo "import --exact the two new changesets from foo to foo2 (or try to)"
cd foo2
hg log -G --debug | cat
echo "import the first new changeset - this will work fine"
hg import --exact ../foo/exp3
hg log -G --debug -r3 | cat

echo "this will fail - presumably because of the extra graft metadata in rev 4"
hg import --exact ../foo/exp4
)

这不能回答OP关于如何调试它的第一个问题,但这是关于出了什么问题的猜测(第二个问题)。

更新:

事实上,这已被发现并记录为错误:

https://bz.mercurial-scm.org/show_bug.cgi?id=4857

不幸的是,它不是固定的。

相关问题