我的项目由以下位置的代码组成
C:\Dev\ProjectA
C:\Lib\LibraryB
C:\Lib\LibraryC
目前,这些文件夹中的每一个都是一个完全独立的Mercurial存储库。项目A一直在更改,而库B和C则很少更改。
我目前在发布项目A的每个版本时都会对其进行标记,并且(当我记得时)在库B和C的存储库中放置一个相应的标记。
我可以使用子存储库对此进行改进吗?是否需要我将库B和C设置为Project A的子目录?
如果库B和C必须是项目A的子目录,如果我想启动一个使用库B但与项目A完全无关的项目D,该怎么办?
最佳答案
如果库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,无论何时克隆Project A,都必须将库B和库C的克隆放在
libraries
文件夹中。如果您在Project A中工作并提交,则在
libraries/LibraryB
和libraries/LibraryC
中所做的更改也将被提交。 Mercurial将在.hgsubstate
文件中记录项目A正在使用哪个版本的库。结果是,如果您hg update
使用旧版本的项目来查看上周的工作方式,则还将获得相应版本的库。您甚至不需要制作标签:-)当您将项目A更改为受祝福的存储库时,Mercurial还将确保首先将子存储库更改推向自己的来源。这样,您永远不会意外地发布依赖于未发布的库更改的项目更改。
如果您希望将所有内容都保留在本地,则仍可以通过使用相对路径而不是子存储库定义中的URL来使用此工作流程。
关于mercurial - 商业子存储库是否必须是主存储库的子目录?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4457538/