1

我的团队即将尝试 Mercurial 及其分支功能(现在我们使用的是 Subversion,但它主要用作代码存储,而不是带有分支的完整版本控制系统等)。所以这里有一个问题:我正在开发一组 DLL,每个库实现都位于自己的文件夹中。我有一个地方(“Common”文件夹),其中包含这些库的接口单元以及其他队友的通用单元。

它看起来像这样:

    \资源  
        \我的图书馆1  
        \我的图书馆2  
        \我的图书馆3  
    \常见的  
        MyLibrary1_Intf.h  
        MyLibrary2_Intf.h  
        MyLibrary3_Intf.h  

当我想为 MyLibrary3 创建一个分支时,我应该怎么做?好的,我正在为 MyLibrary3 创建一个分支,但是 MyLibrary3_Intf.h 呢?我也应该为 \Common 创建一个分支吗?我应该提一下,假设每个项目(库)都位于自己的存储库中。以及通用文件。我不喜欢为所有源代码树创建一个存储库的想法,因为有很多库。问题是:你如何处理这种情况?

4

3 回答 3

1

也许您应该尝试子存储库:

https://www.mercurial-scm.org/wiki/Subrepository

于 2013-02-19T12:29:12.980 回答
0

首先,你必须至少了解和理解Subversion 和 Mercurial 之间的一些根本区别(这与 CVCS 与 DVCS无关)

  • 如果需要,在 Subversion 中,您可以(并且实际上拥有大多数布局)分支子树的任何部分。在 Mercurial 中,您分支整个存储库
  • 在 Subversion svn:externals 可以引用目录或目录内的单个文件,在 Mercurial (sub|guest)repos 中只能链接整个外部存储库(在某些状态下) - 即您将无法链接(简单,技巧仍然可能) 在 MyLibrary1 存储库 MyLibrary1_Intf.h文件中,仅存储库(与 MyLibrary1_Intf.h 分开或与所有 Common 共享)

关于您的问题

当(如果)MyLibrary* 和 Common 是独立的存储库,链接为超级和子存储库时,MyLibrary* 中的分支不会影响 Common(您总是在子存储库的某些状态 /changeset/ 中链接 / 可以在相同或不同的分支中对于 superrepo/superrepo 的 .hgsubstate 中的不同分支),因此 - 您可以自由选择如何根据库分支更改的要求更改 *.h 文件

PS:承诺的技巧是为所有 *.h 提供一个通用 repo,但在 subrepo 中只需要一个文件

Subrepo 定义允许使用任何合法的 URL 规范,其中之一是repository#cset-id,其中 changeset-id 可以是任何适用的 id(也可以是分支名称)。因此,如果您将从默认分支(包含所有文件)为每个 MyLibrary 创建单独的命名分支并在每个此分支文件中删除,与特定库无关,使用分支 id 定义 suprepo,superrepo 将只知道文件(s ) 在这个分支

于 2013-02-21T23:02:04.890 回答
0

除非您必须独立“发布”您的库,否则您可以使用单独的存储库。否则,最好使用 ONE repo 来省去很多 repo 管理和库同步的麻烦。

使用 1 个 repo,您​​可以使用真正的分支来为各个库实现干净的修订历史记录(如果这是一个目标)。分支模型可能如下所示:

develop    
main branch  ----------o--o---------o---o--
                      /  /|        /   /
lib1 branch  --o--o--o----+-o---------o----
                       /  |      / 
lib2 branch  --o------o---+--o-------------
                          |    /    
lib3 branch  -o----o------+---o------o-----
                          ^
                         sync
于 2013-02-19T16:25:27.467 回答