mercurial子存储库是否必须是主存储库的子目录?

时间:2010-12-16 04:51:16

标签: mercurial subrepos

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

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

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

我目前标记了项目A的每个版本,因为它已经发布,并且(当我记得的时候)在库B和C存储库中放置了相应的标记。

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

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

2 个答案:

答案 0 :(得分:18)

  

如果B和C必须是   项目A的子目录我该怎么做   如果我想启动项目D那就做   使用图书馆B,但不是   是否隶属于项目A?

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

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

blessed repository

您可以在自己的服务器上运行hgwebdir,也可以使用BitbucketKiln等Mercurial托管服务。通过这种方式,开发人员可以通过中央授权点来提取/推送更改,并且您可以进行备份。

现在,您可以通过两种不同的方式制作这些存储库的克隆:

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

    hg clone http://bitbucket.org/LachlanG/LibraryB C:\Lib\LibraryB
    
  • 和/或创建子存储库定义,将.hgsub文件放在ProjectA的根目录中,其中包含以下内容:

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

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

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

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

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

答案 1 :(得分:2)

您确实可以声明项目B的{​​{1}}和C子项目(它们将显示为子目录,如Mercurial Subrepository中所述)。
这将改善你的发布机制,因为它允许你:

  • 将所有回购放在一个地方(A及以下)
  • A
  • 下引用BC的确切标记 如果他们有任何修改,
  • 首先标记每个子仓库
  • 标记A,其中包含AB个标记的信息(C的任何克隆都可以获得A的确切标记和B
  • 使用的C

您也可以将A声明为B的子参与,与D无关。您在A中所做的事情(关于A)对B中使用的B没有任何影响。