如何在'git fsck'上修复'gitmodulesPath:不允许的子模块路径'

时间:2019-04-08 08:57:47

标签: git git-submodules

我有一个非常老的git项目,我在上面做了一个git fsck。 我收到以下输出:

git fsck --full
Prüfe Objekt-Verzeichnisse: 100% (256/256), Fertig.
Prüfe Objekte: 100% (35666/35666), Fertig.
error in blob 5ac33d03cc28290156dcd17cf8a4efd95adee7b9: gitmodulesPath: disallowed submodule path: --force
dangling blob dc3821dca2a21a6253c929915011e5b1be932203

深入了解当前状态后,我还检查了.gitmodules文件的历史记录,因为当前版本没有错误。

一年多以前,我发现一个提交包含以下.gitmodules内容:

[submodule "--force"]
    path = --force
    url = git@gitlab.mygitserver.com:mygroup/myproject.git

在下一次提交中,此子模块再次被删除。所以显然有人在尝试某些子模块的工作方式。现在的问题是,在项目历史中。

git fsck是否真的检查历史记录中的每个.gitmodules文件是否随时都有错误? 我该如何解决呢?

1 个答案:

答案 0 :(得分:0)

遇到相同的问题,并且能够删除错误消息。

$ git fsck           
Checking object directories: 100% (256/256), done.
Checking objects: 100% (686/686), done.
error in blob 6d244aeea44652df31a9a243a339608c7ba0ee5d: gitmodulesPath: disallowed submodule path: --force

有人添加了一个名为“ --force”的子模块,然后将其删除,但是当然它仍在历史中。

解决方案(您可能要在尝试此操作之前备份您的存储库...)

  1. 查找引入了损坏的“ --force”子模块的提交(git log --all --full-history -- "--force"帮助了我)
  2. 使用交互式变基(git rebase -i <commit-hash-1-before>)丢弃它

(确保在所有分支中都放弃提交)

现在,您应该有一个“悬挂的斑点”,它不属于任何提交。此时git fsck仍报告错误。

为了摆脱斑点:

  1. git reflog expire --expire=now --all(不是100%确保要求此内容)
  2. git gc --prune=now

瞧,

$ git fsck  
Checking object directories: 100% (256/256), done.
Checking objects: 100% (545/545), done.