如何检查结帐文件的一致性?

时间:2017-10-31 06:51:50

标签: git

git fsck仅检查数据库。 git status只有统计档案。

在系统崩溃和长度fsck之后,如何让git检查结帐文件'一致性?

1 个答案:

答案 0 :(得分:1)

让我试着改写一下这个更准确,因为一种方式,答案是"你不能"#34;另一个是你可以(我可以回答那个)。

设置是某些东西损坏了系统上的某些文件,但是你有一个通过git fsck的存储库,所以你认为存储库本身都可以。该存储库有一个工作树;工作树中包含文件。如何使用Git判断所有文件是否完好无损?

答案是,您不能,因为并非所有工作树文件都对应于存储库中版本化的文件。此外,并不要求工作树文件在其内部存储库中保留相同的表单,或者如果您在git checkout提交上运行HEAD,则会保留该表单。

另一方面,您可能希望将已提交版本的文件与其提交的版本进行比较,以查看它们是否匹配,如果不匹配,则更详细地检查它们。这里的问题是虽然git status 似乎这样做,但我们知道(可能从检查Git源)git status首先在每个文件上调用lstat,然后将统计结果与.git/index中索引文件中的缓存数据进行比较。如果统计结果与索引文件匹配,Git假定文件内的数据是正确的 - 但由于系统本身已损坏,我们担心即使stat结果内部数据可能已损坏与之前相同。

这个问题的解决方案很简单:完全删除索引文件。 1 然后运行git reset,重新构建索引。由于实际上没有缓存的lstat数据(我们删除了,或者至少移动了旧索引),Git必须重建所有内容。

现在git status的输出是可信的:在从{{1}填写(新)索引后,它真正将工作树与(新)索引进行比较提交。

(此时,如果您保存了旧索引,现在可以将其恢复,并在禁用时重新启用自动HEAD。)

1 如果你信任索引内容 - 它有自己的内部SHA-1哈希检查,所以它可能是好的,它可能有一些值,即{{1现在在存储库中具有哈希ID的ed文件 - 您可以暂时git gc将其放在一边,然后再git add。您也可以在此期间停用自动mv,但只要您只运行mvgit gc,就不需要这样做了。

请注意,有一种替代方法不依赖于Git:只需重新签出相同的提交并直接将树与普通文件系统工具(例如,每个文件git reset)进行比较。您可以通过在本地克隆存储库来非常简单地完成此任务。