Git仓库中包含Git仓库

46

我有一个名为A的主要git存储库,并且我们正在使用另一个git存储库B中的源文件在我们主项目的子目录中。现在,在此使用的子目录中检出B存储库将是不错的选择。

让我来可视化一下目录结构:

+ main_repository       - 主存储库的根目录
  + src                 - 包含源代码的目录
    + foreignRepo       - 这应该是另一个git存储库的根目录
  + binaries
  + other

这在远程存储库中也必须知道,只有本地副本对我没有帮助,因为其他人要检查这个并且必须能够编译所有内容。


一篇博客文章解释了每种方法的优缺点 Git Submodule: Git Subtree - Paul Rougieux
3个回答

28

12
在git版本1.7.11及以上的版本中使用git subtreegit subtree优于git submodule,因为:
  • 管理简单工作流程容易。支持旧版git(甚至v1.5.2之前的版本)
  • 在超级项目克隆完成后立即可用子项目的代码
  • git subtree不需要您的代码库的用户学习任何新知识,他们可以忽略您正在使用subtree来管理依赖项的事实
  • git subtree不像git submodule那样添加新的元数据文件(如.gitmodule)
  • 可以修改子树的内容而无需在其他地方拥有单独的依赖项存储库副本

此外,如果需要将现有代码库的子树分离成新的代码库,可以使用git subtree split

2020年2月更新: 现在我更喜欢使用subrepo


11

您可以在不使用子模块的情况下嵌套两个git仓库。假设ChildRepo是ParentRepo的子目录,且两者都是git仓库。

+ ParentRepo
  - ChildRepo

如果您将文件添加到ChildRepo中,则ParentRepo将忽略它。当您提交时,它将被添加到ChildRepo中。不可能将ChildRepo中的文件添加到ParentRepo中。

更多信息:嵌套GIT仓库陷阱!


1
我刚刚尝试将子存储库嵌套在父存储库中。当我向子存储库添加文件时,我执行了 cd ../git status 命令,但是父存储库并没有忽略新文件。 - chharvey
2
你需要将 ChildRepo 放入 .gitignore 吗? - somenxavier
我忘记把几天的ChildRepo工作推送到github上了。我的ParentRepo内容不知怎么被破坏了。我已经恢复了它。但是ChildRepo是空的(我以为ParentRepo至少会保留ChildRepo的文件,但是文件夹完全为空)。这是几天的工作。希望能够找回来。有什么办法吗? - Ahmad Ismail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接