【问题标题】:How can I repair a git repository with a missing object?如何修复缺少对象的 git 存储库?
【发布时间】:2011-12-01 20:24:57
【问题描述】:

我的开发存储库在某个时候丢失了一个对象。

$ git fsck
fatal: failed to read object 2dddc84156fa30e4614a7ea5a1895885011b8db8: Invalid argument
$ git cat-file -t 2dddc84156fa30e4614a7ea5a1895885011b8db8
error: unable to find 2dddc84156fa30e4614a7ea5a1895885011b8db8
fatal: git cat-file 2dddc84156fa30e4614a7ea5a1895885011b8db8: bad file

新克隆的存储库具有该对象。

$ git cat-file -t 2dddc84156fa30e4614a7ea5a1895885011b8db8
tree

我想保留我的开发存储库,它有未推送的分支和存储。

如何将该对象修补到损坏的存储库中?

【问题讨论】:

标签: git


【解决方案1】:

我最近在一个本地存储库和一个未损坏的参考存储库中有一堆丢失的对象来恢复它。这是我想出的对我有用的魔法:

cd <path-to-local-repo>
git unpack-objects < <reference-repo-path>/objects/pack/pack-<hash>.pack

事实证明,我需要的所有对象都位于参考存储库的包文件中,而不是单独的“松散”对象文件中。这个简单的咒语将打包文件解包到本地数据库中,填补了漏洞。做完之后

git gc

为了清理任何悬空提交(即由于变基、修改提交等),我的 git fsck 现在是干净的。

【讨论】:

  • 完美!工作得很好!谢谢!
【解决方案2】:

您可以尝试从新克隆的存储库中获取文件.git/objects/2d/ddc84156fa30e4614a7ea5a1895885011b8db8 并将其复制到您的开发存储库中...

【讨论】:

  • 嗯,这在新的 repo 中不存在。 .git/objects/ 包含一个空的 info/pack/pack-dce082ac46b5bd850378e93f384a1b8e01e3b87a.idx 加上 pack/pack-dce082ac46b5bd850378e93f384a1b8e01e3b87a.packgit unpack-objects -r &lt; .git/objects/pack/pack-dce082ac46b5bd850378e93f384a1b8e01e3b87a.pack 声称它已 100% 解压,但我找不到它们。
  • OIC,我需要将它们解压缩到一个新的仓库中。 cd /path/to/broken-repo; git unpack-objects &lt; /path/to/clean-repo/.git/objects/pack/pack-blahblah 获取所有可能丢失或损坏的东西有什么害处吗?
【解决方案3】:

这几乎可以归结为:你在任何地方都有那个文件的备份(.git/objects/2d/ddc84156fa30e4614a7ea5a1895885011b8db8)吗?如果你能找到它,将它复制回你的 git 存储库,一切都会再次好起来的。换句话说,您是否知道存储库是否已被克隆?如果有,您将在克隆的 git 文件夹中找到该文件并将其复制到您的文件夹中。如果你还没有克隆存储库,你有没有把它压缩到某个地方?如果你在 Mac 上,你检查过 Time machine 吗?如果您不在 Mac 上,您是否正在使用某些东西来备份您的代码?

基本上可以归结为:您需要备份该文件。 Git 的设计使得当这种情况发生时,您只需使用备份(它是存储库的克隆)来恢复文件。也就是说,文件名基于 SHA1 哈希,所以如果您可以在其他人的存储库中找到该文件名,那么您很有可能可以在自己的存储库中使用它:)

始终将存储库克隆到另一个位置通常是一种很好的做法,以防万一发生此类情况。这也是 github 和 bitbucket 这样的服务如此受欢迎的原因。

您可能还想看看这个问题:How to recover Git objects damaged by hard disk failure?

【讨论】:

  • 他说他有一个新克隆的存储库(参见第二个代码 sn-p)。只是一件简单的事情:git 文件名是 sha1,而不是 md5 :)
  • 谢谢。更新了我的答案:)。此外,如果您新克隆的存储库具有该对象,@klaustopher 的建议将解决问题。
猜你喜欢
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 2020-04-23
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多