最近我用于开发的主机开始过热。我开始每天有 4 到 5 次锁定。一切都冻结了。我所有的项目都使用 git 进行版本控制。
我记得在 Google 上看过 Linus 的演讲,他说 git 将确保文件不会损坏。在我的情况下,可以安全地假设如果其中一个源文件损坏,git 会警告我。
操作系统是 Mac OS X 10.4 文件系统是 HFS+。
最近我用于开发的主机开始过热。我开始每天有 4 到 5 次锁定。一切都冻结了。我所有的项目都使用 git 进行版本控制。
我记得在 Google 上看过 Linus 的演讲,他说 git 将确保文件不会损坏。在我的情况下,可以安全地假设如果其中一个源文件损坏,git 会警告我。
操作系统是 Mac OS X 10.4 文件系统是 HFS+。
您可以强制 Git 使用git fsck
. 如果 Git 存储库损坏,您应该从未损坏的存储库中获取新的克隆。
在正常操作下,Git 应该在读取存储库的部分内容时对其进行检查,因此可能需要更长的时间才能注意到某些损坏,但在您第一次尝试访问损坏的数据时会注意到。
当 Linus 说 Git 确保文件没有损坏时的意思是,他指的是当你引用一个特定的提交(由它的哈希标识)时,你可以保证它总是引用完全相同的存储库状态. 如果您从 Linus 的树中提取 linux 内核,并且他引用了一些提交 ae6bcd1...,那么您无能为力(即使在您的本地存储库中)使提交 ae6bcd1... 看起来与当他提到它时,Linus 正在查看。
此外,因为提交对象包含对其父提交的(全部)引用,所以当您引用提交时,您也保证了它在 DAG 中的完整历史记录。
至于文件损坏,这是一个独立的问题;但如果您的工作树文件之一损坏,则不会损坏实际的 blob 对象(即 .git/objects/ob/ject_hashname),您将能够从先前的提交状态或索引/缓存状态恢复。
在这种情况下,除非您进行强制推送(这会覆盖遥控器上的历史记录),否则您将永远无法损坏遥控器,因为推送可确保提交对象形成连续的历史记录图。
最近我不得不验证崩溃的服务器上的存储库,我使用了以下命令:
for gitdir in $(sudo find / -name ".git" -type d -printf "%h "); do
cd $gitdir && ( git fsck && echo "${gitdir} - "'HAPPY !' ) \
|| echo "${gitdir} - "'ERROR !';
done