将Git子模块添加到子文件夹

34
在 SVN 中,您可以将存储库链接到另一个 SVN 存储库中的任何文件夹。我想知道 Git 是否有类似的功能?基本上,我想在我的存储库中添加一个 Git 子模块,但我希望子模块是指向另一个 Git 存储库中的子文件夹,而不是整个存储库。这可能吗?
3个回答

27

Git不支持部分检出,因此子模块必须指向完整的存储库。

Git邮件列表中的此线程提供了一些背景信息。

Panther Software的这篇文章提供了其他人尝试实现类似目标(即使用 Git 复制 svn:externals )的一些见解。

如果两个项目都在您的控制之下,则建议将您感兴趣的"子文件夹"隔离到自己的独立存储库中。 然后,两个项目可以创建链接到它的子模块。


1
是的,如果子文件夹要在两个项目之间共享,那么它听起来应该成为自己的模块。 - Dana the Sane
1
链接失效,位于Panther Software的网址为http://panthersoftware.com/articles/view/3/svn-s-svn-externals-to-git-s-submodule-for-rails-plugins。 - Nam G VU

24

我也遇到了同样的问题。从 git 级别来看,它似乎无法解决,至少不能让您轻松地拉取或推送到父级仓库。

但是,您可以通过使用简单的符号链接来解决这个问题:

  1. 在单独的目录中设置子模块。
    • git submodule add http://example.com/repo.git ./submodules/repo
  2. 在您想要的位置创建指向子文件夹的符号链接:
    • ln -s ./submodules/repo/subdirectory ./wherever/symlinked_directory

参考资料:


2
对于Windows用户,请尝试使用mklink命令。 - MZD

3
通常情况下,当您尝试提取其他项目的子文件夹时,该子文件夹应首先是一个单独的项目,并且两个父项目都应引用它。
您可以使用 git subtree 等工具提取此类子项目的历史记录。然后,您可以使用 git submodule 或 git subtree 将子树链接回您的项目中,以您喜欢的任何一种方式。

13
并非总是如此。例如,我想将 Twitter Bootstrap 拉入我的项目中,以使用 .less 文件。我不需要所有的示例和解析器等,只需要位于 /lib/ 文件夹中的 .less 文件。但目前我无法仅通过子模块单独获取这些文件。 - Hades
您可以使用 git subtree 仅将特定子目录映射到存储库中的目录。 - technomage

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