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

Lea*_*rou 141 git dependencies github git-submodules githooks

在我的脚本中,我经常使用拥有自己的存储库的库(我或其他人).我不想在我的仓库中复制那些,并且每次新版本发布时都不得不更新它们.但是,当有人克隆回购时,它仍应在本地工作,而不是断开链接.

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

Emi*_*ily 201

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

git submodule add path_to_repo path_where_you_want_it
Run Code Online (Sandbox Code Playgroud)

因此,如果库的存储库有一个URL git://github.com/example/some_lib.git并且您希望它在lib/some_lib项目中,则输入:

git submodule add git://github.com/example/some_lib.git lib/some_lib
Run Code Online (Sandbox Code Playgroud)

请注意,这需要从存储库中的顶级目录完成.所以不要cd进入你把它放在第一位的目录.

添加子模块后,或者有人对您的存储库进行全新检查时,您需要执行以下操作:

git submodule init
git submodule update
Run Code Online (Sandbox Code Playgroud)

然后,您添加的所有子模块将以您拥有的相同版本进行检出.

如果要更新到其中一个库的较新版本,请cd进入子模块并执行以下操作:

cd lib/some_lib
git pull
Run Code Online (Sandbox Code Playgroud)

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

  • [阅读本文](https://codingkilledthecat.wordpress.com/2012/04/28/why-your-company-shouldnt-use-git-submodules/)了解子模块的优势以及解决潜力的方法的问题.和[关于它的讨论](https://news.ycombinator.com/item?id=3904932). (4认同)
  • 我知道这是一个老答案,但git子模块可以使用`git submodule update --remote更新.我建议使用更多的标志来处理更复杂的项目.我使用`git submodule update --remote --recursive --init` (3认同)
  • 谢谢你的回答,upvoted!(明天可能会接受它)有没有办法只从其他仓库添加一个文件作为依赖?或者它必须是一个完整的文件夹? (2认同)
  • 如果要将其作为子模块进行跟踪(因此,能够轻松获取更新),则必须引入整个存储库.与许多其他VCS不同,git实际上只想处理顶级存储库. (2认同)
  • @topher217据我了解答案,您可以选择要将子模块放入的任何子目录,您只需从顶级目录*调用* git 命令(我假设是因为那是 git 配置所在的位置)。 (2认同)