繁体   English   中英

hg拷贝有什么作用?

[英]What does hg copy do?

我们最近在我们的存储库中做了一个目录的hg copy 我们认为它做的事情就像cp -ahg add并且可能标记这个文件已经从repo中的另一个文件复制(所以hg annotate显示原始提交者)。 但现在看来, hg copy做的更多或不同。 我真的找不到复制的确切方式。 所以:

  • hg copy究竟做了什么以及这将在未来引起什么特殊处理?
  • 如果事实证明对我们的案例做了“错误的事情(tm)”,我该如何取消文件作为另一个文件的副本?

(这个问题是在Mercurial邮件列表中提出的,您可能也想跟随原始帖子 。)

  • 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 ab节点,这里存在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

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

如果您还原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权威指南

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM