Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复由于旧的无效gitmodules文件而导致的git fsk错误?_Git - Fatal编程技术网

如何修复由于旧的无效gitmodules文件而导致的git fsk错误?

如何修复由于旧的无效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服务器上,我们自动运行定期的
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