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


101

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

我想更改我的子模块以指向该文件夹。当我查看.gitmodules时,我看到

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

我应该使用哪个URL代替https://github.com/boto/boto.git?更改URL后,是否应该在本地删除boto文件夹并重新拉动?


3
它不是您想要的-不是子模块-但您可以看看git subtree
Cascabel 2011年

1
我最终要做的是拥有整个子模块,并告诉IntelliJ boto文件夹是“源文件夹”,以便它可以在其中找到包。
ripper234 2011年

15
我不敢相信git不会在本地执行此操作。
rogerdpack

2
发现了类似的问题- stackoverflow.com/questions/1121227/...
sashoalm

Answers:


65

恐怕子模块的URL总是仅指向存储库-您不能指定您只想要存储库的子文件夹,就像git通常不支持“窄克隆”一样。

如果您不能将整个存储库作为子模块使用,则始终可以创建一个从boto克隆的新存储库,然后将cron作业设置为:

  1. git fetch 将该存储库放入目录
  2. 使用git filter-branch其中的子目录是在顶层更新某个分支。
  3. 将存储库的该分支添加为子模块。但是,这有点麻烦,我的选择只是将整个存储库作为子模块使用。

24

您不能仅克隆存储库的一部分。这是因为git将存储库视为一个整体对象:当您获得它时,便会获得全部

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


我在Windows中有符号链接...也很好用。(这是因为我在计算机上安装了msys,因此可以ln -s在linux中使用它)
kumarharsh13年

7
Vista和&随附MKLink。我用那个 howtogeek.com/howto/windows-vista/...
天使S.莫雷诺

1
您可以改用硬链接
KindDragon

15

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

希望这可以帮助。


什么是“后合并”?你能举个例子吗?
Sukima

一种“上游”的合并-从高阶分支到低阶分支。莱纳斯讨厌那些。它们与可能已经合并的其他分支机构的历史联系在一起。
亚当·迪米特鲁克

在这种情况下,能否请您添加一些有关“后合并”的示例?
2013年

通常,这是当您尝试合并主线分支中的事物以使功能分支保持最新状态时,每个人都在合并其最新更改。这很糟糕,因为它将您的分支机构与其他人的工作联系在一起。如果产品需要您的分支机构,但不需要集成分支机构中已有的其他分支机构,则不可能。
亚当·迪米特鲁克

有趣的主意,有人尝试过吗?我将尽快尝试,但是仍然不确定“后合并”是否可以自动实现...
moudrick
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.