【问题标题】:Deleting all Git cached submodules from repository从存储库中删除所有 Git 缓存的子模块
【发布时间】:2016-01-20 02:06:05
【问题描述】:

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

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

rm -rf .git/modules

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

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

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

【问题讨论】:

  • 不起作用:它仍然留下一个 170.7 MB .git/modules 文件夹。
  • gist.github.com/myusuf3/7f645819ded92bda6677 :: 有效地删除/替换子模块。
  • @parasrish 您链接到一个违反许可证 cc by-sa 3.0 的要点,需要注明出处,因为它是 stackoverflow.com/a/1260982/1033581 的未注明副本。最重要的是,它没有回答问题,因为它假定一个已知的“path_to_submodule”,这与我所说的“我们不记得子模块的各个名称在旧提交中使用。"
  • @Cœur 无法完全理解您的意见。但是,w.r.t. “path_to_submodule”,查询似乎是通用的(就像我自己一样),但不像“未知子模块名称”那样具体。在这种状态下,发布为“避免查询的明确答案”以及“发布新查询毫无意义”。因此在 cmets 中添加了有用的信息。

标签: git git-submodules


【解决方案1】:

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

好吧,我认为我们可以通过首先执行干净的删除过程来解决这两种情况,然后假设某些事情没有正确完成并执行手动清理。

删除一个子模块的必要步骤在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\.[^.]*\)\(.*\)/\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

【讨论】:

    【解决方案2】:

    使用 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 本地是的。在服务器端,应该有很少的子模块相关数据,因为子模块基本上是指向其他存储库的指针。
    猜你喜欢
    • 2014-02-18
    • 2013-11-01
    • 2021-05-13
    • 1970-01-01
    • 2015-09-18
    • 2014-06-06
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多