问题 hg拷贝有什么作用?


我们最近做了一个 hg copy 我们的存储库中的目录。我们想到了 做的事情 cp -a 和 hg add 并且可能以某种方式标记 此文件已从repo中的另一个文件复制(所以 hg annotate 显示原始提交者)。但现在看来 hg copy 做的更多或不同的东西。我真的找不到 很多关于如何复制的工作原理。所以:

  • 到底是什么 hg copy 这有什么特别的待遇 未来的原因?
  • 如果事实证明对我们的案件做了“错误的事情(tm)”,我该怎么做 取消标准文件作为另一个文件的副本?

(您可能希望在Mercurial邮件列表中提出此问题 按照原始主题 太。)


5460
2017-12-16 09:06


起源

你也可以阅读 复制文件 在里面 Mercurial:权威指南 书。 - Matus


答案:


  • hg拷贝究竟做了什么以及做了什么特殊处理   未来的原因?

它添加新文件并将其标记为旧文件的副本。因为它们是副本,所以原始文件中的更改将合并到副本中。时间从左到右流动:

(init) --- (edit a.txt) ---- (a.txt edit is copied to b.txt)
      \                     /
       (hg copy a.txt b.txt)
  • 如果事实证明对我们的案件做了'错误的事(tm)',我该怎么做   取消标准文件作为另一个文件的副本?

合并时,此机制才会启动。如果 b.txt 不存在于 共同的祖先修订(上图中的init),然后是Mercurial 向后搜索,看看是否 b.txt 从其他地方复制。

让我们以缩写形式继续上面的图表:

(i) -- (edit a) -- (a edit copied to b) -- (edit a) -- (merge)
   \              /                                   /
    (copy a b) --/------- (edit b) ------------------/

问题是最终合并是如何完成的。共同的祖先点 现在是 copy a b 节点和这两个 a 和 b 存在。意即 那里不会有任何副本搜索!所以第二次编辑到 a 惯于 合并成 b

为了仔细检查,我试了一下:

$ hg init
$ echo a > a
$ hg add a
$ hg commit -m init
$ hg copy a b
$ hg commit -m "copy a b"

这是副本, b 现在包含 a 只要。

$ hg update 0
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo aa >> a
$ hg commit -m "edit a"
created a new head
$ hg merge
merging a and b to b
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg commit -m "a edit copied to b"

这是第一次合并和编辑 a 已被复制到 b

$ cat b
a
aa

我们现在并行进行更改:

$ echo aaa >> a
$ hg commit -m "edit a again"
$ hg update 3
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo bbb >> b
$ hg commit -m "edit b"
created new head
$ hg merge
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

没有进一步的复制:

$ cat a
a
aa
aaa
$ cat b
a
aa
bbb

至于禁用此...您无法真正明确禁用该副本 检测。但正如我希望上面说明的那样,它不会“打扰”你 第一次合并后再次

如果第一次合并是个问题,那么你可以使用 hg resolve --tool internal:local 将文件重置回您之前的状态 开始合并。所以

$ hg resolve --tool internal:local b

我们本可以带来的 b 回到只包含一行 a


14
2017-12-16 09:11



抱歉, 不能 确认合并头的复制更改 我的 测试。 >hg version Mercurial Distributed SCM (version 2.0.1) - Lazy Badger
还没有在第一次合并?请写下mercurial@selenic.com,以便我们可以在那里完整地讨论,这比这些小评论框要好得多:) - Martin Geisler
“还没有在第一次合并?” - 是的电子邮件注明,邮件将被发送(带日志) - Lazy Badger
如果你不能用我的步骤重现它,这很奇怪...感谢您将日志发送到列表,这应该使讨论更容易。 - Martin Geisler
你弄清楚了问题吗?我没有在邮件列表上看到任何日志。 - Martin Geisler