我们最近在我们的存储库中创建了一个hg copy
目录。我们想到了
做cp -a
和hg add
之类的事情,也许会以某种方式标记
此文件已从repo中的另一个文件复制(因此hg
annotate
显示原始提交者)。但现在似乎hg
copy
做的事情多于或多不同。我真的找不到
很多关于如何复制的工作原理。所以:
hg copy
究竟做了什么以及做了什么特殊处理
未来的原因?(这个问题是在Mercurial邮件列表中提出的,您可能也想要follow the original thread。)
答案 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
节点,此处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
带回到只包含{{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