【问题标题】:Nested Git repositories?嵌套的 Git 存储库?
【发布时间】:2010-12-24 16:25:46
【问题描述】:

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

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

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

【问题讨论】:

    标签: git


    【解决方案1】:

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

    【讨论】:

    • chrisjean.com 博客似乎不是最新的,因为只是尝试关注它。 Greg 的 wiki 帖子可能有点复杂,但作为一个 git 新手,我更喜欢准确而不是简单......
    • 博客现在似乎运行良好,不幸的是,对于 sage 来说,对评论的 34(现在 35)赞成票似乎同意博客文章中的价值。事实证明,您不必为了清晰和针对特定操作的建议而牺牲准确性。阅读后,我想作者已经进行了一些研究,并且可能阅读了实际的Git documentation,而不仅仅是 kernel.org wiki 页面。博客作者在一个完全上下文化的示例中的面向 Git 的解释似乎对大量个人很有帮助......
    • 顺便说一句,上面提到的 chrisjean 链接已经死了。更新后的链接是chrisjean.com/git-submodules-adding-using-removing-and-updating
    【解决方案2】:

    将您的第三方库放在单独的存储库中,并使用子模块将它们与主项目相关联。这是一个演练:Git Tools - Submodules(Pro Git 书籍,第 2 期。)

    在决定如何分割一个 repo 时,我通常会根据我修改它们的频率来决定。如果它是第三方库,并且您对其所做的更改只是升级到新版本,那么您绝对应该将其与主项目分开。

    【讨论】:

    • 可能希望在您的链接上将“s”添加到“https”以实现安全连接。
    • @Nomnom 完成。链接已更新为“https”。
    【解决方案3】:

    只是为了完整性:

    还有另一种解决方案,我会推荐:subtree merging

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

    $ git remote add -f ThirdPartyGitRepo /project_root/
    $ git merge -s ours --no-commit ThirdPartyGitRepo/master
    $ git read-tree --prefix=third_party_git_repository_used_by_my_project/ -u ThirdPartyGitRepo/master
    $ git commit -m "Merge ThirdPartyGitRepo project as our subdirectory"`
    

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

    $ git pull -s subtree ThirdPartyGitRepo master
    

    我多年来一直在使用这种方法,它很有效:-)

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

    【讨论】:

    • 合并参考到 git book 的子树不再起作用。目前,这似乎是链接:git-scm.com/book/en/v2/…
    • 我能否请教您是否可以使用 OP 的路径,例如 /project_root/my_project 会帮助我解决这个问题。我的两个项目都在积极开发中,所以对我来说,子树听起来比子模块好。
    • 非常公平的建议@Tomachi。完成。
    【解决方案4】:

    你可以添加

    /project_root/third_party_git_repository_used_by_my_project
    

    /project_root/.gitignore
    

    这应该可以防止嵌套的 repo 包含在父 repo 中,并且您可以独立使用它们。

    但是:如果用户在父 repo 中运行 git clean -dfx,它将删除被忽略的嵌套 repo。另一种方法是对文件夹进行符号链接并忽略符号链接。如果您随后运行 git clean,符号链接将被删除,但“嵌套”存储库将保持不变,因为它实际上位于其他位置。

    【讨论】:

    • 我想知道是否有人尝试过这个.. thx,我会试一试。
    【解决方案5】:

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

    【讨论】:

    【解决方案6】:

    总结。

    我可以嵌套 git 存储库吗?

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

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

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

    这里是a SO question,其中涵盖了使用每种方法的优缺点。

    【讨论】:

    • 博客链接失效了。
    【解决方案7】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-26
      • 2012-05-06
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      相关资源
      最近更新 更多