从仓库中删除所有Git缓存的子模块

19

我们的团队已经很长时间不再使用子模块了,我们希望通过删除所有缓存的子模块来释放一些仓库空间。

那我们只需要删除以下内容吗?


rm -rf .git/modules

还有更好的推荐方法吗?如果可能的话,我们希望将删除推送到服务器。

注意:使用git 2.5.4,并且当前状态将所有内容合并到一个分支中。

注意:我们不记得旧提交中使用的子模块的个别名称。


在这里提到了 git submodule deinit,https://dev59.com/QHM_5IYBdhLWcg3wt1k0 - J.J. Hakala
不起作用:它仍然留下了一个大小为170.7 MB的.git/modules文件夹。 - Cœur
https://gist.github.com/myusuf3/7f645819ded92bda6677 :: 为有效地删除/替换子模块。 - parasrish
@parasrish,您链接到了一个违反许可证CC BY-SA 3.0的要求的Gist,因为它是未经授权的https://dev59.com/QHM_5IYBdhLWcg3wt1k0#1260982的副本。此外,它并没有回答问题,因为它假定已知“_path_to_submodule_”,这与我的问题相矛盾,我在其中声明“_我们不记得旧提交中使用的子模块的具体名称_”。 - Cœur
@Cœur,我没有完全理解你的评论。然而,关于“path_to_submodule”,这个问题似乎是通用的(因为我自己也有一个),但不像“未知子模块名称”那样具体。在这种情况下,“避免将答案明确回答”并且“发布新的查询是没有意义的”。因此,在评论中添加了有用的信息。 - parasrish
2个回答

47

在我的问题中,我发现可能会有一些小的混淆,关于“不使用子模块”:是否还留下了未使用的子模块文件夹,还是这些文件夹已经被删除,只剩下缓存?

好的,我认为我们可以通过先遵循清除过程来解决这两种情况,然后假设某些事情没有正确执行,进行手动清理。

删除一个子模块的必要步骤在如何删除子模块中有说明。但为了回答这个问题,我们将一次性删除所有子模块,而不是假设我们知道子模块的名称。

# deinit all submodules from .gitmodules
git submodule deinit .

# remove all submodules (`git rm`) from .gitmodules
git submodule | cut -c43- | while read -r line; do (git rm "$line"); done

# delete all submodule sections from .git/config (`git config --local --remove-section`) by fetching those from .git/config
git config --local -l | grep submodule | sed -e 's/^\(submodule\.[^.]*\)\(.*\)/\1/g' | while read -r line; do (git config --local --remove-section "$line"); done

# manually remove leftovers
rm .gitmodules
rm -rf .git/modules

我不知道服务器同步的情况。它可以在下次提交时自动完成,或者我们可能需要使用这些命令:

git submodule sync
git submodule update --init --recursive --remote

7

使用 Git 2.7

git submodule deinit mysubmod
git rm mysubmod
git commit -m "Remove mysubmod"
git push
rm -rf .git/modules/mysubmod

这将更新 .gitmodules.git/config,并删除其中的 mysubmod.git。否则,如果想要在名为 mysubmod 的目录中有一些内容,就会出现问题。
在这种情况下,只剩下最后一部分需要完成。由于子模块基本上只是指向其他存储库的指针,除非这些被引用为子模块的存储库将被删除,否则没有太多需要清理的。使用存储库的旧提交可能会变得更加困难。

没有'mysubmod'文件夹,因为我们已经很长时间不再使用子模块了。所以只需要像问题本身所述的那样rm -rf .git/modules就可以了。 - Cœur
@Cœur 本地是可以的。在服务器端,子模块相关数据应该很少,因为子模块基本上是指向其他存储库的指针。 - J.J. Hakala

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