18

我的项目由以下位置的代码组成

C:\Dev\ProjectA
C:\Lib\LibraryB
C:\Lib\LibraryC

目前,这些文件夹中的每一个都是一个完全独立的 Mercurial 存储库。项目 A 一直在变化,图书馆 B 和图书馆 C 很少变化。

我目前在项目 A 的每个版本发布时都对其进行标记,并且(当我记得时)将相应的标记放在库 B 和 C 存储库中。

我可以通过使用子存储库来改进这一点吗?这是否需要我将库 B 和 C 设为项目 A 的子目录?

如果库 B 和 C 必须是项目 A 的子目录,如果我想启动一个使用库 B 但根本不隶属于项目 A 的项目 D,我该怎么办?

4

2 回答 2

18

如果库 B 和 C 必须是项目 A 的子目录,如果我想启动一个使用库 B 但根本不隶属于项目 A 的项目 D,我该怎么办?

任何项目都可以独立存在,也可以同时作为另一个项目的子存储库存在。我将通过建议工作流程来进行解释。

首先,您的每个项目(A、B、C)都应该有一个发布在某处的受祝福的存储库:

祝福的存储库

您可以在自己的服务器上运行hgwebdir ,或者使用像BitbucketKiln这样的 Mercurial 托管服务。这样,开发人员就有了一个中央权威点来拉/推更改,并且您可以进行备份。

现在,您可以克隆这些存储库,以便以两种不同的方式进行操作:

  • 直接克隆你的项目。例如:

    hg clone http://bitbucket.org/LachlanG/LibraryB C:\Lib\LibraryB
    
  • 和/或通过将文件放在具有以下内容的根目录中来创建子存储库定义:.hgsubProjectA

    libraries/libraryB = http://bitbucket.org/LachlanG/LibraryB
    libraries/libraryC = http://bitbucket.org/LachlanG/LibraryC
    

这些子存储库定义告诉 Mercurial,每当克隆项目 A 时,它还必须将库 B 和库 C 的克隆放入libraries文件夹中。

如果您在项目 A 中工作并提交,那么您在项目 A 中的更改libraries/LibraryBlibraries/LibraryC将被提交。Mercurial 将在文件中记录项目 A 正在使用哪个版本的库.hgsubstate。结果是,如果您hg update到旧版本的项目查看上周的工作情况,您还将获得相应版本的库。你甚至不需要制作标签:-)

当您hg push将项目 A 更改为受祝福的存储库时,Mercurial 还将确保首先将子存储库更改推送到它们自己的源。这样您就不会意外发布依赖于未发布库更改的项目更改。

如果您希望将所有内容都保留在本地,您仍然可以通过在子存储库定义中使用相对路径而不是 URL 来使用此工作流程。

于 2010-12-16T10:42:50.133 回答
2

您确实可以声明项目的子存储库(它们将显示为子目录B,如Mercurial Subrepository中所述)。 这将改善您的发布机制,因为它允许您:CA

  • A在一个地方(及以下)获取所有回购
  • 引用以下的确切B标签CA
  • 如果每个子仓库有任何修改,请先标记它们
  • A带有相关信息B和标签C的标签(任何克隆都A将能够获得准确的标签BC使用的标签A

您还可以声明B为 的子存储库D,独立于A. 你在A(关于)中所做的对使用在中B没有任何后果。BD

于 2010-12-16T07:01:58.437 回答