如何将特定更改集推送到Mercurial中的共享库存储库?

And*_*rew 3 mercurial shared-libraries

我有一个名为MySharedLib的仓库,另一个名为MyProject的仓库.MySharedLib通过强制拉动(如Jedi)包含在许多不同的回购中,而不是使用子版本.

如果克隆MyProject,则会留下以下结构:

/MyProject
    MySharedLib
    OtherStuff
    Files...
Run Code Online (Sandbox Code Playgroud)

MySharedLib不是subrepo.从MySharedLib中提取更改就像运行一样简单:

hg pull -f path/to/MySharedLib.
Run Code Online (Sandbox Code Playgroud)

但是如果对/ MyProject/MySharedLib进行了更改,那么将这些更改仅推送到MySharedLib存储库的最简单/标准方法是什么?

MQ?hg出口?hg diff?hg移植?我的理解是,几乎所有这些选项都有效(有些在一起,有些在一起),但我想要一些方向.

然后,如果开发者提交包含MySharedLib中的其他文件的提交,会发生什么?显然这是要避免的,但我只是好奇.

Ry4*_*ase 7

以下是管理您可以推送的内容的约束:

  • 你只能推送整个变更集 - 如果你一起进行一些更改,那么在推送前端是全部或者没有,你提交后就无法分解变更集
  • 如果不将其所有的祖先变更集推送到,你就无法推动变更集

所以,一旦你提交了这样的线性历史:

[0]---[1]----[2]-----[3]
Run Code Online (Sandbox Code Playgroud)

你可以在不推动两个和三个的情况下推动变更集零和一个,但如果你想推两个你也必须推零和一个.

如果变更集包含对/ MyProject/OtherStuff和/ MyProject/MySharedLib /的更改,则必须将它们组合在一起.

在您可以控制的地方提交之前,您唯一的灵活性是:

  • 什么变成了变革集
  • 变更集的父母是什么(也必须用它推)

因此,如果您的历史记录目前如下:

[0]---[1]
Run Code Online (Sandbox Code Playgroud)

hg status显示如下:

M MyProject/OtherStuff/file1
M MyProject/OtherStuff/file2
M MyProject/MySharedLib/file3
M MyProject/MySharedLib/file4
Run Code Online (Sandbox Code Playgroud)

然后,您希望创建一个仅包含要推送的MySharedLib更改的新变更集:

hg commit --include MyProject/MySharedLib
Run Code Online (Sandbox Code Playgroud)

让你的历史看起来像:

[0]----[1]-----[2]
Run Code Online (Sandbox Code Playgroud)

然后,在提交OtherStuff中的更改之前,您不希望推动您执行hg update更改当前parent修订,以便新的更改集将具有父项1而不是2:

hg update 1
Run Code Online (Sandbox Code Playgroud)

现在你做的时候:

hg commit
Run Code Online (Sandbox Code Playgroud)

你的新变更集三只将只有非MySharedLib更改而且父级为1,所以历史记录将如下所示:

[0]-----[1]--------[2]
          \
           --------[3]
Run Code Online (Sandbox Code Playgroud)

由于两个和三个不是彼此的祖先,你可以推动任何一个而不推动另一个.

也就是说,无所谓是正确的:你的用法不仅仅是奇怪的,而是出错了.你应该看一下subrepo设置.它几乎肯定比你或我刚刚描述的更好地实现了你的目标.