嵌套的git存储库?

Jer*_*ond 173 git

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

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project
Run Code Online (Sandbox Code Playgroud)

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

Gre*_*ill 149

您可能正在寻找称为子模块的Git功能.此功能可帮助您管理嵌套在主存储库中的相关存储库.

  • 作为一个相对git初学者,我发现这个博客/教程更容易理解http://chrisjean.com/2009/04/20/git-submodules-adding-using-removing-and-updating/通过聚焦采取更简单的方法只是git而不是有一个辅助shell脚本的上下文; 我发现它更容易阅读. (41认同)
  • 顺便说一句,上面提到的 chrisjean 链接已失效。更新后的链接是 https://chrisjean.com/git-submodules-adding-using-removing-and-updating/ (18认同)
  • chrisjean.com博客似乎并不是基于试图遵循它的当前基础.来自Greg的wiki帖子可能有点复杂,但作为一个git新手我更喜欢准确到简单...... (3认同)

Igo*_*aka 35

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

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

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


Phi*_*hil 18

只是为了完整性:

还有另一个解决方案,我建议:子树合并.

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

$ 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"`
Run Code Online (Sandbox Code Playgroud)

然后,为了将其他存储库拉入您的目录(更新它),请使用子树合并策略:

$ git pull -s subtree OtherRepository master
Run Code Online (Sandbox Code Playgroud)

我现在使用这种方法多年了,它有效:-)

关于这种方式的更多信息,包括将它与子模块进行比较,可以在这个git howto doc中找到.

  • 将子树合并到 git 书中的参考不再起作用。目前,这似乎是链接:https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging#_subtree_merge (2认同)

mik*_*eum 16

你可以添加

/project_root/third_party_git_repository_used_by_my_project
Run Code Online (Sandbox Code Playgroud)

/project_root/.gitignore
Run Code Online (Sandbox Code Playgroud)

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

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


eph*_*ent 14

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

  • 此功能随后合并到Git中.这是一个很好的描述:https://developer.atlassian.com/blog/2015/05/the-power-of-git-subtree (3认同)

lac*_*chy 7

概括。

我可以嵌套 git 存储库吗?

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

git init/add /project_root 来简化本地所有内容的管理是否有意义,或者我是否必须分别管理 my_project 和第 3 方项目?

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

这是一个 SO 问题,涵盖了使用每种方法的优点和缺点。