在错误的文件剥离后中断Mercurial中的文件连接
背景: 起初有一个文件在错误的文件剥离后中断Mercurial中的文件连接,mercurial,Mercurial,背景: 起初有一个文件base.c,该文件位于存储库中,该存储库只有一个分支base Base被分支以进行扩展-分支。然后,这个新分支对base.c进行了几处更改 如果在base中的base.c文件中修复了错误,则它们将合并到扩展 事实证明,在Extended分支中向base.c添加太多内容不是一个好主意,所以文件被复制到ext.c。然后从base.c中删除大部分扩展的添加,并从ext.c中删除base功能。因此在这一点上,Extended中的base.c与base中的非常相似 问题: 分割文件
base.c
,该文件位于存储库中,该存储库只有一个分支base
Base
被分支以进行扩展
-分支。然后,这个新分支对base.c
进行了几处更改
如果在base
中的base.c
文件中修复了错误,则它们将合并到扩展
事实证明,在Extended
分支中向base.c
添加太多内容不是一个好主意,所以文件被复制到ext.c
。然后从base.c
中删除大部分扩展的
添加,并从ext.c
中删除base
功能。因此在这一点上,Extended
中的base.c
与base
中的非常相似
问题:
分割文件时,Mercurial被告知ext.c
是base.c
的副本,因为它们共享一个共同的历史记录。不幸的是,这不是一个好主意
现在,如果bug固定在Base
分支上,并合并到Extended
,Mercurial认为这些更改应该同时应用于Base.c
和ext.c
,即使后者不再与前者有任何相似之处。这使得合并非常恼人
有没有办法告诉Mercurial,
ext.c
不应再被视为与base.c
相同?一种解决方案是用新文件替换ext.c
,但历史记录不会随之出现。您可以断开与hg forget ext.c
的连接,然后将hg add ext.c
作为新文件。但是,如果您使用ext.c
的tip修订版执行此操作,您将丢失到目前为止的所有历史记录
您可以做的是添加一个早期版本的ext.c
,甚至可以在重命名之前添加,并重播(移植)其自那时以来的历史。您可以将ext.c
的历史记录作为分支添加到过去的修订中,并将其合并到tip:
---o---o---o---(tip)--(merge)
\ /
e---e---e ... e
或者也许这并不重要,您可以将ext.c
的历史记录添加到当前的tip
:
---o---o---o---(tip)--e--e--e--e
这两种方法都不涉及任何历史重写(ext.c的“被遗忘”版本只是一条死胡同),因此传播更改应该没有问题。有趣的问题。我假设您是用
hg copy
复制的?是hg copy
被使用。如果hg忘记ext.c
然后hg将其添加为新文件,您可能会断开连接。。。但到目前为止,你将失去所有的历史。但是,您可以添加一个早期版本的ext.c
(甚至可能在重命名之前),并重播(嫁接)它自那时以来的历史。@alexis这就是我最终所做的。你可能应该补充这一点作为答案,因为这个问题似乎偶尔会引起一些活动。