在 git 存储库中将 /\t/ 替换为 //

Replaced /\t/ with / / on git repo

昨晚我在处理我从别人那里继承的遗留代码时睡得太晚了。除了将其置于修订控制之下之外,我还想将代码库从制表符转换为空格。最后在我的工作目录中用两个空格替换了所有制表符。递归地。包括 .git 目录。我做了一些更改并提交了它们,但还没有将回购推送到其他任何地方。

如果我只需要重新开始回购并将到目前为止的更改压缩到一次提交中,这并不是一个巨大的损失,但假设我付出了努力,这种情况的恢复能力如何?

在某种程度上,我很高兴我在进入太深之前犯了这个错误,但假设这是一个长达数年的项目的唯一副本,你会有多糟?

Recursively. Including the .git directory First you need to verify that your .git folder is not "broken".

# Verify that the .git folder and all the objects are still usable
git fsck --full

如果您没有看到悬空数据,则没有关系。

but hadn't pushed the repo anywhere else yet

即使你推了你仍然可以恢复所有以前的数据(除非你做了强制推)


In a way I'm glad I made this mistake before I got too far in, but suppose it was the only copy of a years-long project, how screwed would you be?

如果你没有备份,你会遇到很大的麻烦。这是一种可以恢复的情况,但需要大量工作。


如何从此错误中恢复?

如果您已将所有制表符替换为空格,反之亦然,您将不得不再次尝试替换它们,好消息是 git 具有 SHA-1,即 sha1sum内容(内容本身是压缩的,里面的格式不应该包含任何空格。

很短(比这个复杂一点)git计算以下内容的SHA-1并压缩:

blob<space><content_lengt><null><content>

然后git用zlib压缩以上内容。因此,如果您知道文件的存储方式,您可以尝试恢复它们,但这需要大量工作。另一方面,内容中不应该有空格,所以你把里面的东西弄乱的几率 (.git/object) 很小。

Summary

不管你做什么从不触摸.git文件夹!!!