2010-12-16 56 views
18

我的项目是由代码在以下位置mercurial subrepository是否必须是主存储库的子目录?

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,我该怎么办?

回答

18

如果库B和C必须 子目录A项目做什么,如果我要开始一个项目d是 使用图书馆B I 做,但不以其他方式 与项目A在所有下属?

任何项目都可以存在两种独立如在同一时间的另一项目的subrepository。我会通过建议工作流程来解释。

首先,每个项目(A,B,C)中必须存在某处发表了祝福库:

blessed repository

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

现在你可以让这些存储库的克隆两种不同的方式上工作:

  • 直接克隆项目。例如:

    hg clone http://bitbucket.org/LachlanG/LibraryB C:\Lib\LibraryB 
    
  • 和/或通过把一个.hgsub文件中的ProjectA根与以下内容创建subrepository定义

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

这些subrepository定义告诉水银说每当项目A被克隆时,它也必须将库B和库C的克隆放入libraries文件夹中。

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

当您将hg push项目A更改为有福的存储库时,Mercurial还会确保将子备份更改首先推送到其原始位置。这样您就不会意外发布取决于未发布的库更改的项目更改。

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

+0

您在末尾提到的库文件夹在哪里,“这些子库定义告诉mercurial,无论projectA被克隆,它还必须将LibraryB和LibraryC的克隆放入库文件夹中。” – LachlanG 2010-12-16 11:44:51

+0

它只是一个文件夹,左边的部分是:libraries/libraryB = http://bitbucket.org/LachlanG/LibraryB是右边的克隆应该是 – 2010-12-16 13:57:45

+0

@LachlanG:它会出现在ProjectA的根目录克隆,例如'C:\ Dev \ ProjectA \ libraries \'。 – 2010-12-16 16:11:29

2

您确实可以声明BC子项目A子目录(它们将显示为子目录,如Mercurial Subrepository中所述)。
这将提高你的释放机制,因为这将允许您:

  • 得到所有回购在一个地方(A及以下)
  • 参考BC下的每个A
  • 标签标签的准确子回购如果他们有任何修改
  • 标签A与关于BC标签在其中的信息(任何克隆A将能够得到exa通过A使用)的BC克拉标签

还可以声明B作为D一个subrepo,独立的A。您在A(与B有关)中所做的将对D中使用的B没有任何影响。

相关问题