【问题标题】:What does hg copy do?hg复制有什么作用?
【发布时间】:2011-12-16 09:06:07
【问题描述】:

我们最近对我们存储库中的一个目录进行了hg copy。我们以为 做类似cp -ahg add的事情,也许会以某种方式标记 该文件是从 repo 中的另一个文件复制而来的(所以hg annotate 显示了原始提交者)。但现在看来hg copy 做了更多或不同的事情。我真的找不到 很多关于复制的工作原理。所以:

  • hg copy 究竟做了什么,做了什么特殊处理 以后有什么原因?
  • 如果结果证明我们的情况是“错误的事情 (tm)”,我该怎么办 取消将该文件标记为另一个文件的副本?

(这个问题是在 Mercurial 邮件列表上提出的,您可能也想follow the original thread。)

【问题讨论】:

标签: version-control mercurial merge


【解决方案1】:
  • hg copy 到底有什么作用,有什么特殊处理 以后有什么原因?

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

(init) --- (edit a.txt) ---- (a.txt edit is copied to b.txt)
      \                     /
       (hg copy a.txt b.txt)
  • 如果事实证明我们的情况是“错误的事情 (tm)”,我该怎么办 取消将该文件标记为另一个文件的副本?

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

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

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

问题是最终合并是如何完成的。共同祖先点 现在是copy a b 节点,这里ab 都存在。这表示 不会有任何副本搜索!所以对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

【讨论】:

  • 抱歉,无法my 测试中确认合并头上的复制更改。 >hg version Mercurial Distributed SCM (version 2.0.1)
  • 也不是第一次合并?请写信给 mercurial@selenic.com,以便我们在那里进行全面讨论,这比这些小评论框要好得多:)
  • "同样不在第一次合并中?" - 是的。已注明电子邮件,将发送消息(带日志)
  • 如果你不能用我的步骤重现它,这很奇怪......感谢您将日志发送到列表中,这应该更容易讨论。
  • 你发现问题了吗?我没有在邮件列表中看到任何日志。
【解决方案2】:

如何取消将文件标记为另一个文件的副本?

如果您还原 hg 副本,则复制到的文件随后仍保留在您的工作目录中,不被跟踪。你只需要正常添加它。 复制过来的文件完全不受影响。

% hg copy file new-file
% hg status -C
A new-file
__file
% hg revert new-file
% hg add new-file
% hg status -C
A new-file

参考:Mercurial: The definitive guide

【讨论】:

    猜你喜欢
    • 2011-11-29
    • 2012-11-25
    • 2010-11-09
    • 2013-07-24
    • 2015-05-03
    • 2013-07-08
    • 2010-10-27
    • 2019-05-06
    • 1970-01-01
    相关资源
    最近更新 更多