hg拷贝有什么作用?

时间:2011-12-16 09:06:08

标签: version-control mercurial merge

我们最近在我们的存储库中创建了一个hg copy目录。我们想到了 做cp -ahg add之类的事情,也许会以某种方式标记 此文件已从repo中的另一个文件复制(因此hg annotate显示原始提交者)。但现在似乎hg copy做的事情多于或多不同。我真的找不到 很多关于如何复制的工作原理。所以:

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

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

2 个答案:

答案 0 :(得分:15)

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

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

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

此机制仅在您合并时启动。如果b.txt中没有b.txt 共同的祖先修订(上图中的init),然后是Mercurial 向后搜索以查看是否从其他地方复制了(i) -- (edit a) -- (a edit copied to b) -- (edit a) -- (merge) \ / / (copy a b) --/------- (edit b) ------------------/

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

copy a b

问题是最终合并是如何完成的。共同的祖先观点 现在是a节点,此处ba都存在。这意味着 那里不会有任何副本搜索!所以对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带回到只包含{{1}}的一行。

答案 1 :(得分:0)

  

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

如果还原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