我们最近在我们的存储库中创建了一个目录的hg副本.我们以为是
做一些像cp -a和hg这样的添加,也许标志不定
这个文件已经从repo中的另一个文件复制了(所以hg
注释显示原始提交者).但现在似乎是hg
复制品比这更多或不同的东西.我找不到
很多关于复制的工作原理.所以:
做一些像cp -a和hg这样的添加,也许标志不定
这个文件已经从repo中的另一个文件复制了(所以hg
注释显示原始提交者).但现在似乎是hg
复制品比这更多或不同的东西.我找不到
很多关于复制的工作原理.所以:
>什么是hg副本做什么和什么特殊待遇这样做
在未来的原因?
>如果事实证明对我们的情况做“错误的事情(tm)”,我该怎么办?
将文件取消标记为另一个文件的副本?
(这个问题在Mercurial邮件列表中被询问,你可能也想要follow the original thread)
解决方法
- What exactly does hg copy do and what special treatment does this
cause in the future?
它添加新文件并将其标记为旧文件的副本.因为它们是副本,原始文件中的更改将被合并到副本中.时间从左到右:
(init) --- (edit a.txt) ---- (a.txt edit is copied to b.txt) \ / (hg copy a.txt b.txt)
- If it turns out to do ‘the wrong thing(tm)’ for our case,how do I
unflag the file as beeing a copy of another file?
这种机制只有在合并时才会开始.如果b.txt不存在
共同的祖先修订版(上图中的init),然后Mercurial将会
进行向后搜索以查看b.txt是否从其他地方复制.
让我们以缩写形式继续上述图表:
(i) -- (edit a) -- (a edit copied to b) -- (edit a) -- (merge) \ / / (copy a b) --/------- (edit b) ------------------/
问题是最终合并是如何完成的.共同的祖先点
现在是复制一个b节点,这里a和b都存在.意即
那没有任何搜索副本!所以第二个编辑一个wont
合并成b.
要仔细检查,我试过了:
$hg init $echo a > a $hg add a $hg commit -m init $hg copy a b $hg commit -m "copy a b"
这是副本,b现在包含一个.
$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 unresolved $echo bbb >> b $hg commit -m "edit b" created new head $hg merge 1 files updated,don't forget to commit)
没有进一步的复制:
$cat a a aa aaa $cat b a aa bbb
至于禁用这个…你不能真正地明确禁用副本
检测.但是,正如我希望以上说明的那样,它不会“打扰”你
第一次合并后再次.
如果第一个合并是一个问题,那么可以使用hg resolve –tool
内部:本地将文件重新设置为您的状态
开始合并所以
$hg resolve --tool internal:local b
我们可以把b带回来只包含一行.