我的项目由以下位置的代码组成
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,我该怎么办?
答案 0 :(得分:18)
如果B和C必须是 项目A的子目录我该怎么做 如果我想启动项目D那就做 使用图书馆B,但不是 是否隶属于项目A?
任何项目都可以作为另一个项目的子存储库同时独立存在和。我将通过建议工作流程来解释。
首先,您的每个项目(A,B,C)都应该有一个在某处发布的受祝福的存储库:
您可以在自己的服务器上运行hgwebdir,也可以使用Bitbucket或Kiln等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/LibraryB
和libraries/LibraryC
中的更改也将被提交。 Mercurial将记录.hgsubstate
文件中项目A正在使用的库版本。结果是,如果您hg update
到项目的旧版本以查看上周的工作方式,您还可以获得相应版本的库。你甚至不需要制作标签: - )
当您hg push
项目A更改为受祝福的存储库时,Mercurial还将确保将子存储库更改首先推送到他们自己的源。这样,您就不会意外地发布依赖于未发布的库更改的项目更改。
如果您希望将所有内容保留在本地,则仍可以使用相对路径而不是子存储库定义中的URL来使用此工作流。
答案 1 :(得分:2)
您确实可以声明项目B
的{{1}}和C
子项目(它们将显示为子目录,如Mercurial Subrepository中所述)。
这将改善你的发布机制,因为它允许你:
A
及以下)A
B
和C
的确切标记
如果他们有任何修改,A
,其中包含A
和B
个标记的信息(C
的任何克隆都可以获得A
的确切标记和B
)C
您也可以将A
声明为B
的子参与,与D
无关。您在A
中所做的事情(关于A
)对B
中使用的B
没有任何影响。