1

我有两个 mercurial 存储库,generic并且specific是第一个 repo 的克隆:

$ hg glog -R generic 
@  changeset:   0:d516ded3bf0a
   summary:     generic project commit

$ hg glog -R specific 
@  changeset:   3:5f7b2efea94b
|  summary:     added another specific project change
o  changeset:   2:e2ad52001bcf
|  summary:     added generic project change (backport)
o  changeset:   1:a4220a2c7a80
|  summary:     added specific project change
o  changeset:   0:d516ded3bf0a
   summary:     generic project commit

现在我想将变更集 2 反向移植specificgeneric. 我不想添加变更集 1 和 3,只添加 cs 2(cherry-pick)。似乎有两种选择:移植移植。移植是可以的,因为它允许从另一个存储库移动补丁(在我的情况下从specificto generic),但它在合并功能方面受到限制。另一方面,嫁接将提供更智能的合并,但不支持从另一个 repo 嫁接(仅在同一分支之间)。

目标是仅将变更集 2 添加specificgeneric. 我就是这样进行的,没有成功。

$ cd specific
$ hg up 0 # the common ancestor
$ hg branch backport-cs2
$ hg graft 2

$ hg glog
@  changeset:   4:1405acc4a121
|  branch:      backport-cs2
|  tag:         tip
|  parent:      0:d516ded3bf0a
|  summary:     added generic project change (backport)
|
| o  changeset:   3:5f7b2efea94b
| |  summary:     added another specific project change
| |
| o  changeset:   2:e2ad52001bcf
| |  summary:     added generic project change (backport)
| |
| o  changeset:   1:a4220a2c7a80
|/   summary:     added specific project change
|
o  changeset:   0:d516ded3bf0a
   summary:     generic project commit

到目前为止,一切都很好。最后一步是将的分支拉到的默认分支backport-cs2中。specificgeneric

$ cd ../generic
$ hg pull -b backport-cs2 ../specific
$ hg glog 
o  changeset:   1:1405acc4a121
|  branch:      backport-cs2
|  tag:         tip
|  summary:     added generic project change (backport)
|
@  changeset:   0:d516ded3bf0a
   summary:     generic project commit

现在generic有我想要的变更集,但它在一个新分支中,而我希望将其设为默认值。任何建议如何做到这一点?更好的反向移植方法的想法也受到赞赏。

4

1 回答 1

1

一般来说,你正在做的事情很难,因为这不是一个好主意。如果这些项目真的有那么多共同点,那么它们应该有更多的共同点,而不仅仅是零变更集。例如,理想情况下,特定的会定期合并默认的“通用”——这是一种非常常见的模式。可以对“特定”进行高度自定义,或者有 1000 个“通用”没有的文件,或者删除 100 个文件,并且合并仍然很好。很难双向做到这一点,但如果你要“通用”到“默认”,你应该努力保持它经常可合并。

作为公司内部的一个例子,拥有一个名为“skel”之类的存储库并不少见,其中包括所有项目样板,并且您开始新项目作为“skel”的克隆。当有人更新“skel”,比如更改使用条款文件或其他内容时,您可以将 skel 合并到您的项目中,即使您的项目已从 8 个文件变为 8000 个文件 - 合并仍然有效。

也就是说,如果你不能这样做,你应该只使用transplant. 使用graft使合并更容易,只是因为它可以考虑最近的共同祖先,并且特别是使后续的移植更容易。当您只是将其从第一个变更集中挂起时,这些都不适用——我怀疑您的合并将与移植案例的合并相同,并且移植至少包含一些元数据,这使得移植相同的变更集两次会引发警告。

也就是说,如果您真的想走上面的路线,请跳过这hg branch backport-cs2条线。当你嫁接时,你只会在完全没问题的default分支上创建一个新头specific,然后当你拉动时,你会在“特定”中默认获得一个新头,然后你可以将它合并进去'会在你想要的分支上——但不要那样做。按预期使用合并,如果不能,则仅使用移植。

于 2013-10-29T03:27:02.530 回答