gpt4 book ai didi

version-control - 命名分支与多个存储库

转载 作者:行者123 更新时间:2023-12-03 04:30:12 25 4
gpt4 key购买 nike

我们目前正在相对较大的代码库上使用 Subversion。每个版本都有自己的分支,并且针对主干执行修复并使用 svnmerge.py 迁移到发布分支中

我相信现在是时候进行更好的源代码控制了,而且我已经使用 Mercurial 一段时间了。

关于使用 Mercurial 管理此类发布结构,似乎存在两种观点。每个版本都有自己的存储库,并对发布分支进行修复并推送到主分支(以及任何其他较新的发布分支)。或者在单个存储库(或多个匹配副本)中使用命名分支。

无论哪种情况,我似乎都可能会使用诸如移植之类的东西来挑选更改以包含在发布分支中。

我问你;每种方法的相对优点是什么?

最佳答案

最大的区别在于分支名称在历史记录中的记录方式。对于命名分支,分支名称​​嵌入在每个变更集中,因此将成为历史记录的不可变部分。对于克隆,将没有关于特定变更集来自何处的永久记录。

这意味着克隆非常适合您不想记录分支名称的快速实验,而命名分支则适合长期分支(“1.x”、“2.x”等)。

另请注意,单个存储库可以轻松容纳 Mercurial 中的多个轻量级分支。可以为此类存储库内分支添加书签,以便您可以轻松地再次找到它们。假设您已经克隆了公司存储库,如下所示:

[a] --- [b]

你破解并制作[x][y]:

[a] --- [b] --- [x] --- [y]

意味着当有人将 [c][d] 放入存储库时,因此当您拉取时,您会得到如下历史图表:

            [x] --- [y]           /[a] --- [b] --- [c] --- [d]

Here there are two heads in a single repository. Your working copy will always reflect a single changeset, the so-called working copy parent changeset. Check this with:

% hg parents

假设它报告[y]。您可以看到头部带有

% hg heads

这将报告[y][d]。如果您想将存储库更新为干净 checkout [d],则只需执行(将 [d] 替换为 [d]):

% hg update --clean [d]

然后您将看到 hgparents 报告[d]。这意味着您的下一次提交将以 [d] 作为父级。因此,您可以修复在主分支中注意到的错误并创建变更集[e]:

            [x] --- [y]           /[a] --- [b] --- [c] --- [d] --- [e]

To push changeset [e] only, you need to do

% hg push -r [e]

其中[e]是变更集哈希。默认情况下,hg push 将简单地比较存储库并查看 [x][y][e] 缺失,但您可能还不想共享 [x][y]

如果错误修复也影响了您,您希望将其与您的功能分支 merge :

% hg update [y]
% hg merge

这将使您的存储库图表看起来像这样:

            [x] --- [y] ----------- [z]           /                       /[a] --- [b] --- [c] --- [d] --- [e]

where [z] is the merge between [y] and [e]. You could also have opted to throw the branch away:

% hg strip [x]

我这个故事的要点是:单个克隆可以轻松代表多个发展轨迹。对于不使用任何扩展的“plain hg”来说,这始终是正确的。 bookmarks extension不过,这是一个很大的帮助。它将允许您为变更集指定名称(书签)。在上面的情况下,您需要在开发头上有一个书签,在上游头上有一个书签。 Mercurial 1.6 中可以推送和拉取书签,并且已成为 Mercurial 1.8 中的内置功能。<​​/p>

如果您选择创建两个克隆,则在创建 [x][y] 后,您的开发克隆将如下所示:

[a] --- [b] --- [x] --- [y]

您的上游克隆将包含:

[a] --- [b] --- [c] --- [d]

您现在注意到了该错误并修复了它。在这里,您不必 hg update 因为上游克隆已准备好使用。您提交并创建[e]:

[a] --- [b] --- [c] --- [d] --- [e]

要将错误修复包含在您的开发克隆中,您可以将其拉入其中:

[a] --- [b] --- [x] --- [y]           \            [c] --- [d] --- [e]

并 merge :

[a] --- [b] --- [x] --- [y] --- [z]           \                   /            [c] --- [d] --- [e]

该图可能看起来不同,但它具有相同的结构并且最终结果是相同的。使用克隆,你需要做的心理记账工作会少一些。

命名分支并没有真正出现在这里,因为它们是相当可选的。在我们转向使用命名分支之前,Mercurial 本身是使用两个克隆开发多年的。除了“默认”分支之外,我们还维护一个名为“稳定”的分支,并基于“稳定”分支进行发布。请参阅standard branching wiki 中的页面,了解推荐工作流程的描述。

关于version-control - 命名分支与多个存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/890723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com