如何修复由于旧的无效gitmodules文件而导致的git fsk错误?
在我们的集中式git服务器上,我们自动运行定期的如何修复由于旧的无效gitmodules文件而导致的git fsk错误?,git,Git,在我们的集中式git服务器上,我们自动运行定期的git fsck。我们的一次回购失败,出现以下错误: $ git fsck Checking object directories: 100% (256/256), done. error: bad config line 43 in blob .gitmodules error in blob 31e0c6cb966c309c4e6018fe280bbb9c40ca2902: gitmodulesParse: could not parse gi
git fsck
。我们的一次回购失败,出现以下错误:
$ git fsck
Checking object directories: 100% (256/256), done.
error: bad config line 43 in blob .gitmodules
error in blob 31e0c6cb966c309c4e6018fe280bbb9c40ca2902: gitmodulesParse: could not parse gitmodules blob
我找到了包含此blob的提交:
obj_name=31e0c6cb966c309c4e6018fe280bbb9c40ca2902 ; git log --all "$@" --pretty=format:'%T %h %s' | while read tree commit subject ; do if git ls-tree -r $tree | grep -q "$obj_name" ; then echo $commit "$subject"; fi; done
5adc29a fix develop
然后我跟踪了包含此提交的分支和标记
我可以看到无效的gitmodules,而且由于错误的合并,它确实是无效的。我可以看到分支有另一个commit来修复错误的合并。我还可以看到,带有无效gitmodules文件的commit由两个标记引用
我尝试删除标签并再次运行fsck,但没有帮助
我希望我们的自动git fsck停止警报,似乎最好的方法可能是在特定提交中更正gitmodule。我只需要在服务器上修复它,我不在乎是否有克隆或fork缺少修复,因为错误发生在一年前
我是否可以安全地执行此操作,以及如何执行此操作?简短的回答是否定的:任何提交中的任何内容都无法更改。有一件事你可以做,但有点暴力 你能做什么 您所能做的最好的事情(除了忽略投诉)是构建一个新的、改进的提交:除了bug之外,它与原来的提交完全相同。但这是一个新的提交,具有新的和不同的哈希ID,而不是提交
5adc29a
。因此,现在您必须找到所有将5adc29a
作为其父级的提交,并复制那些将新提交作为新的和改进的父级的提交(以及除5adc29a
作为其其他父级的任何原始提交)
更改了5adc29a
及其直接子级后,现在必须找到5adc29a
的子级。他们也需要得到新的和改进的父母。然后你需要找到他们的孩子,等等。事实上,这一变化在历史的其余部分中产生了涟漪,一直延伸到所有分支提示,这些分支提示都是从现在被替换的坏提交中产生的。然后,它使每个分支名称指向更新的分支提示
有一个Git命令可以完成所有这一切:Git filter branch
。本质上,git filter branch
所做或可以做的是循环存储库中的每个提交,应用一些过滤器,然后提交结果。如果结果与原始结果完全相同,则结果为原始结果,且无任何变化。但是,如果结果不同,则该提交本身现在有一个新的和改进的替代项,并且每个后续子提交都将根据需要重新设置父级。这当然会改变子对象,因此子对象的副本也是一个新的提交,它会在历史的其余部分中产生涟漪,一直延伸到所有分支提示,这些分支提示都是从原来的现在被替换的提交派生而来的
因此,“所有”您需要做的就是运行一个git filter branch
命令,用一个新的和改进的提交替换坏的提交。在存储库中的每个提交、分支和标记名称上运行此命令,并执行以下操作:
root--c1--c2--...--bad--c1001--c1002--c1003 <-- master
\
c1004--c1005 <-- develop
root--c1--c2----bad--c1001--c1002--c1003简短的回答是否定的:任何提交中的任何内容都无法更改。有一件事你可以做,但有点暴力
你能做什么
您所能做的最好的事情(除了忽略投诉)是构建一个新的、改进的提交:除了bug之外,它与原来的提交完全相同。但这是一个新的提交,具有新的和不同的哈希ID,而不是提交5adc29a
。因此,现在您必须找到所有将5adc29a
作为其父级的提交,并复制那些将新提交作为新的和改进的父级的提交(以及除5adc29a
作为其其他父级的任何原始提交)
更改了5adc29a
及其直接子级后,现在必须找到5adc29a
的子级。他们也需要得到新的和改进的父母。然后你需要找到他们的孩子,等等。事实上,这一变化在历史的其余部分中产生了涟漪,一直延伸到所有分支提示,这些分支提示都是从现在被替换的坏提交中产生的。然后,它使每个分支名称指向更新的分支提示
有一个Git命令可以完成所有这一切:Git filter branch
。本质上,git filter branch
所做或可以做的是循环存储库中的每个提交,应用一些过滤器,然后提交结果。如果结果与原始结果完全相同,则结果为原始结果,且无任何变化。但是,如果结果不同,则该提交本身现在有一个新的和改进的替代项,并且每个后续子提交都将根据需要重新设置父级。这当然会改变子对象,因此子对象的副本也是一个新的提交,它会在历史的其余部分中产生涟漪,一直延伸到所有分支提示,这些分支提示都是从原来的现在被替换的提交派生而来的
因此,“所有”您需要做的就是运行一个git filter branch
命令,用一个新的和改进的提交替换坏的提交。在存储库中的每个提交、分支和标记名称上运行此命令,并执行以下操作:
root--c1--c2--...--bad--c1001--c1002--c1003 <-- master
\
c1004--c1005 <-- develop
root--c1--c2----bad--c1001--c1002--c1003