嵌套的git存储库?

时间:2009-12-09 02:38:31

标签: git

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

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

git init / add / project_root是否有意义在本地轻松管理所有内容,还是我必须单独管理my_project和第三方?

7 个答案:

答案 0 :(得分:140)

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

答案 1 :(得分:35)

将您的第三方库放在一个单独的存储库中,并使用子模块将它们与主项目相关联。这是一个演练:

http://git-scm.com/book/en/Git-Tools-Submodules

在决定如何分割回购时,我通常会根据修改它们的频率来决定。如果它是第三方库,只有您正在进行的更改是升级到更新的版本,那么您一定要将它与主项目分开。

答案 2 :(得分:17)

为了完整性:

还有另一种解决方案,我建议:subtree merging

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

$ 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中找到。

答案 3 :(得分:14)

git-subtree将帮助您在单个树中处理多个项目为它们保留可分离的历史记录。

答案 4 :(得分:13)

你可以添加

/project_root/third_party_git_repository_used_by_my_project

/project_root/.gitignore

应该阻止嵌套的repo包含在父repo中,你可以独立地使用它们。

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

答案 5 :(得分:4)

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

我还会检查我正在使用的第三方库的版本,使用它来检查项目的存储库。

答案 6 :(得分:0)

摘要。

  

我可以嵌套git存储库吗?

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

  

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

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

这里是a blog on the topic,这里是a SO question,涵盖了使用每种方法的利弊。