git fsck
仅检查数据库。
git status
只有统计档案。
在系统崩溃和长度fsck
之后,如何让git检查结帐文件'一致性?
答案 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
,但只要您只运行mv
和git gc
,就不需要这样做了。
请注意,有一种替代方法不依赖于Git:只需重新签出相同的提交并直接将树与普通文件系统工具(例如,每个文件git reset
)进行比较。您可以通过在本地克隆存储库来非常简单地完成此任务。