嵌套的Git存储库?


181

我可以嵌套Git存储库吗?我有:

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

它是否有意义git init/add/project_root,以缓解当地的一切管理或做我必须管理my_project并单独的第三方呢?

Answers:


159

您可能正在寻找称为submodules的Git功能。此功能可帮助您管理嵌套在主存储库中的从属存储库。


43
作为一个相对git的初学者,我发现此博客/教程更容易理解chrisjean.com/2009/04/20/…它采用一种更简单的方法,即只关注git而不是使用帮助程序shell脚本的上下文。我发现它更容易阅读。
约翰·K

4
chrisjean.com博客似乎并非仅基于尝试就已成为最新博客。格雷格(Greg)的Wiki帖子可能更复杂,但是作为git新手,我更喜欢简单而不是简单的……
sage

该博客现在似乎运行良好,不幸的是,对于圣人来说,该评论的34票(现在是35票)赞成票似乎同意该博客文章中有其价值。事实证明,您不必为了准确性和特定于操作的建议而牺牲准确性。阅读之后,我想作者已经进行了一些研究,并且可能阅读了实际的Git文档,而不仅仅是kernel.org Wiki页面。博客作者在完全上下文化的示例中针对Git的解释似乎对许多人都非常有帮助...
Matthew Weber

13
顺便说一句,上面提到的chrisjean链接已死。更新的链接是chrisjean.com/git-submodules-adding-using-removing-and-updating
sprksh


22

仅出于完整性考虑:

我建议使用另一种解决方案:子树合并

与子模块相比,它更易于维护。您将以常规方式创建每个存储库。在主存储库中时,您希望将另一个存储库的主目录(或任何其他分支)合并到主目录的目录中。

$ git remote add -f OtherRepository /path/to/that/repo
$ git merge -s ours --no-commit OtherRepository/master
$ git read-tree --prefix=AnyDirectoryToPutItIn/ -u OtherRepository/master
$ git commit -m "Merge OtherRepository project as our subdirectory"`

然后,为了将另一个存储库拉入目录(以对其进行更新),请使用子树合并策略:

$ git pull -s subtree OtherRepository master

我已经使用这种方法很多年了,它是有效的:-)

可以在git howto doc中找到有关此方法的更多信息,包括与子模块进行比较。


将子树合并到git书中的引用不再起作用。目前,这似乎是链接:git-scm.com/book/en/v2/...
ericx

18

您可以添加

/project_root/third_party_git_repository_used_by_my_project

/project_root/.gitignore

这样可以防止嵌套的回购包含在父回购中,您可以独立使用它们。

但是:如果用户在父仓库中运行git clean -dfx,它将删除忽略的嵌套仓库。另一种方法是对文件夹进行符号链接,然后忽略符号链接。如果您随后运行git clean,则将删除符号链接,但“嵌套”存储库将保持原样,因为它确实位于其他地方。



5

摘要。

我可以嵌套git存储库吗?

是。但是,默认情况下,git不跟踪.git嵌套存储库的文件夹。Git具有旨在管理嵌套存储库(继续阅读)的功能。

git init /添加/ project_root以简化本地所有内容的管理是否有意义,还是我必须分别管理my_project和3rd party?

由于git具有管理嵌套存储库的功能,因此这可能没有任何意义。Git的内置功能来管理嵌套仓库是submodulesubtree

这是有关该主题的博客,这是一个SO问题,涵盖了使用每种方法的优缺点。


2

我将在每个项目中使用一个存储库。这样,历史记录就变得更容易浏览。

我还要将我正在使用的第三方库的版本检查到使用它的项目存储库中。

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.