我一直在研究将第三方存储库和库合并到我的Git项目中的方法。Subversion的svn:externals
功能是该特定VCS的一项引人注目的功能,其他VCS系统(尤其是DVCS系统)很少(如果有的话)具有真正可行的等效功能。Gitsubmodules
并不可怕,但它们假定您需要整个存储库—而SVN允许您根据需要挑选子目录。
为什么我可能只想链接一个子目录?考虑具有这种结构的项目:
docs/ api/ manual/ html/ module_specs/ library/ Foo/ ComponentA/ ComponentB/ tests/ Foo/ ComponentA/ ComponentB/
在另一个项目中,我想使用ComponentB。使用svn:externals
,这很容易:
library/Foo/ComponentB http://repohost/svn/trunk/library/Foo/ComponentB
现在目录已添加和跟踪。
有了Git,情况就不同了。我发现的一种解决方案是使用git-subtree,它是Git的扩展。与svn:externals
相比,它的设置需要更多的努力,但它提供了轻松冻结特定提交并将所有更改压缩为单个提交的好处。
JonWhitcraft最近有一些关于如何使用它的问题,我通过电子邮件回答了他。显然我给他的东西对他有用,因为他随后请求他是否可以发布我的指南——您可以在此处找到。