【问题标题】:Git File IntegrityGit 文件完整性
【发布时间】:2010-11-01 03:34:56
【问题描述】:

最近我用于开发的主机开始过热。我开始每天有 4 到 5 次锁定。一切都冻结了。我所有的项目都使用 git 进行版本控制。

我记得在 Google 上看过 Linus 的演讲,他说 git 将确保文件不会损坏。在我的情况下,可以安全地假设如果其中一个源文件损坏,git 会警告我。

OS 是 Mac OS X 10.4 文件系统是 HFS+。

【问题讨论】:

标签: git version-control sha1


【解决方案1】:

您可以使用git fsck 强制 Git 检查整个存储库。如果 Git 存储库损坏,您应该从未损坏的存储库中获取新的克隆。

在正常操作下,Git 应该在读取存储库的部分内容时对其进行检查,因此可能需要更长的时间才能注意到某些损坏,但它在您第一次尝试访问损坏的文件时被注意到数据。

【讨论】:

  • 如果尝试推送到远程会发生什么?在注意到损坏之前,它是否也会损坏遥控器或抱怨它?
  • 推送到远程意味着将所有文件打包在一起,并且接收器(您要推送到的位置)必须重新计算所有文件的 SHA1。因此,如果文件以某种方式损坏,树中的对象 ID 将开始不匹配,并且损坏会出现 --- 你总是可以回滚到以前的位置并执行 git fsck 来找出你身边的问题.
  • 最后,对象文件是不可变的,因此一旦写入,它们的内容就永远不会改变。发生的唯一操作是重新打包,因此您不能通过推送来破坏远程,因为它不会写入它已经拥有的文件的另一个副本。
【解决方案2】:

最近我不得不验证崩溃的服务器上的 repos,我使用了以下命令:

for gitdir in  $(sudo find / -name ".git" -type d -printf "%h "); do
  cd $gitdir && ( git fsck && echo "${gitdir} - "'HAPPY !' ) \
  || echo "${gitdir} - "'ERROR !';
done

【讨论】:

    【解决方案3】:

    Linus 说 Git 确保文件不会损坏时的意思是,他指的是当您引用特定提交(由其哈希标识)时,您保证它将始终引用完全相同的存储库状态。如果您从 Linus 的树中拉取 linux 内核,并且他引用了一些提交 ae6bcd1...,那么您无能为力(即使在您的本地存储库中)使提交 ae6bcd1... 看起来与当他提到它时,Linus 正在查看它。

    此外,因为提交对象包含对其父提交的(全部)引用,所以当您引用提交时,您也保证了它在 DAG 中的完整历史记录。

    就文件损坏而言,这是一个独立的问题;但如果您的工作树文件之一损坏,则不会损坏实际的 blob 对象(即 .git/objects/ob/ject_hashname),您将能够从先前的提交状态或索引/缓存状态恢复。

    在这种情况下,您将永远无法破坏远程,除非您进行强制推送(这会覆盖远程上的历史记录),因为推送可确保提交对象形成一个连续的历史图表。

    【讨论】:

    • 所以基本上只要我尝试推送一个损坏的 repo,它就会警告我,我总是可以再次克隆我的 repo 并且是安全的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多