如何更改 git 子模块以指向子文件夹?

浏览一下 子模块教程,我用 Boto Project创建了一个子模块。然后,我发现我实际上只需要这个项目的一个子集-特别是 Boto文件夹。

我想改变我的子模块指向这个文件夹

[submodule "backup/src/boto"]
path = backup/src/boto
url = https://github.com/boto/boto.git

我应该使用什么 URL 而不是 https://github.com/boto/boto.git?更改 URL 后,是否应该在本地删除 boto 文件夹并重新拉取?

82137 次浏览

我担心子模块的 URL 总是指向存储库——您不能指定只需要存储库的子文件夹,就像 git 通常不支持“狭义克隆”一样。

如果您无法忍受将整个存储库作为子模块,那么您可以创建一个从 boto 克隆的新存储库,然后设置 cron 作业以:

  1. 将该存储库转换为目录
  2. 使用 git filter-branch更新子目录位于顶层的分支。
  3. 添加存储库的分支作为子模块。然而,这一切都有点复杂,我更倾向于将整个存储库作为一个子模块。

不能只克隆存储库的一部分。这是因为 git 将存储库视为一个完整的对象: 当您得到它时,您得到它 所有

因此,这里的解决方案是在另一个目录中获取子模块,然后使用符号链接来实现目标。

您需要做的是在子模块中创建一个分支,然后向上移动文件夹并删除不需要的内容。然后您可以管理该分支。如果您想提高您的更改,您应该能够首先支持合并。Git 将知道您移动了文件并成功地进行了合并。

希望这个能帮上忙。

这里所有的答案都太过时了。您可以使用较新的 git sparse-checkout命令 我是医生,在 这篇文章中的进一步示例来抓取回购的片段。如果您只想从较大的 git 项目中获取一两个目录,那么这种方法是有效的。

TLDR:

git sparse-checkout init --cone
git sparse-checkout set <dir1> <dir2> ...
git checkout main