如何在git仓库中链接依赖项?


148

在我的脚本中,我经常使用具有自己存储库的库(我的库或其他库)。我不想重复我的仓库中的那些,并且每次新版本发布时都不想更新它们。但是,当有人克隆存储库时,它仍应在本地运行,并且没有断开的链接。

关于我能做什么的任何想法?

Answers:


211

您可以使用git中的子模块来执行此操作。在您的存储库中,执行以下操作:

git submodule add path_to_repo path_where_you_want_it

因此,如果库的存储库的URL为,git://github.com/example/some_lib.git而您想lib/some_lib在项目中使用它,则应输入:

git submodule add git://github.com/example/some_lib.git lib/some_lib

请注意,这需要从存储库的顶级目录中完成。因此,不要cd进入将其放在第一位的目录中。

添加子模块后,或者每当有人对存储库进行新签出时,您需要执行以下操作:

git submodule init
git submodule update

然后,您添加的所有子模块都将以您拥有的相同版本签出。

当您要更新其中一个库的较新版本时,请cd进入子模块并拉出:

cd lib/some_lib
git pull

然后,当您执行a时git status,应该会看到lib/somelib修改部分中列出的内容。添加该文件,提交,您就是最新的。当协作者将该提交提交到他们的存储库中时,他们将被lib/somelib视为已修改,直到git submodule update再次运行。


2
感谢您的回答,已投票!(并且明天可能会接受)是否有办法仅将另一个回购中的一个文件添加为依赖项?还是必须是整个文件夹?
Lea Verou 2011年

2
如果您想将其作为子模块进行跟踪(因此能够轻松提取更新),则必须提取整个存储库。与许多其他VCS不同,git实际上只想处理顶级存储库。
艾米丽

7
阅读本文,以了解子模块的优点以及解决潜在问题的方法。并对此进行讨论
minghua

1
假设您将自己拥有的另一个存储库导入为子模块。您可以通过子模块中的本地更改来对原始存储库进行更改吗?假设您发现了一个错误并需要更新原始错误?
andrevenancio

3
我知道这是一个旧答案,但是可以使用git子模块进行更新,git submodule update --remote尽管对于更复杂的项目,我建议使用更多标志。我使用git submodule update --remote --recursive --init
克里斯(Chris)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.