正在从存储库中删除所有 Git 个缓存的子模块

Deleting all Git cached submodules from repository

我们的团队已经很长时间没有使用子模块了,我们想通过删除所有缓存的子模块来释放一些存储库 space。

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

rm -rf .git/modules

或者有更推荐的方法吗?此外,如果可能,我们希望将删除内容推送到服务器。

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

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

与git2.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.

的目录中包含一些内容,将会出现问题

在这种情况下,只剩下最后一部分需要完成。由于子模块基本上只是指向其他存储库的指针,因此除非要删除那些被称为子模块的存储库,否则不需要清理太多。使用存储库的旧提交可能会变得更加困难。

我在关于 "not using submodules" 的问题中发现了一个可能的小混淆:是否还有未使用的子模块文件夹,或者这些文件夹是否已经删除并且只剩下缓存?

嗯,我认为我们可以通过首先执行干净的删除过程来解决这两种情况,然后假设某些操作不正确并执行手动清理。

How do I remove a submodule?中解释了删除一个子模块的必要步骤。但是为了回答这个问题,我们将立即删除所有子模块,而不假设我们知道子模块的名称。

# 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\.[^.]*\)\(.*\)//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