我今天尝试打开我的存储库,但它没有提交任何提交历史记录。我尝试的一切(git status,git log,git checkout ......)都引发了一个关于腐败对象的错误。
我在网上研究了这个问题并找到了Linus Torvalds的article,但是在他发现链接ID损坏的地方迷路了:我的文件ID,树或blob都没有与之相符的罪魁祸首ID错误信息。
然后我回到了关于恢复"git objects damaged by hard disk failure"的文章和(在将罪魁祸首对象移开之后)继续工作直到
$ cat packed-refs
此时我的电脑说:cat: packed-refs: No such file or directory
我跳过那一步并做了
$ git fsck --full
并获得了相应的输出,但后来我应该将罪魁祸首(或我所指的罪魁祸首,错误引发的sha1 ID)从备份存储库复制回主存储库,然后复制据我所知,从备份存储库中丢失的对象进入主存储库;而且我不想做任何事情太激烈,或者我可能强迫我以后不能强制执行的事情。
所以我的问题是(是),我应该做备份( ooh,newbie alert ),还是我解压缩.pack文件时发生的事情?并且是“罪魁祸首”我实际上是在复制一个干净的文件,即没有损坏?
(我认为只是告诉你我最初对Toritds文件中的“git”和“fsck”之间的简单冲突感到困惑。所以我真的新的。)
$ git status
fatal: object 016660b7605cfc2da85f631bbe809f7cb7962608 is corrupted
$ git status
fatal: bad object HEAD
$ git fsck --full
error: HEAD: invalid sha1 pointer 016660b7605cfc2da85f631bbe809f7cb7962608
error: refs/heads/RPG does not point to a valid object!
dangling tree 2c1033501b82e301d47dbf53ba0a199003af25a8
dangling blob 531aca5783033131441ac7e132789cfcad82d06d
dangling blob 74a47ff40a8c5149a8701c2f4b29bba408fa36f5
dangling blob b8df4d9751c0518c3560e650b21a182ea6d7bd5e
dangling blob fc2d15aead4bd0c197604a9f9822d265bb986d8b
$ git ls-tree 2c1033501b82e301d47dbf53ba0a199003af25a8
040000 tree 4a8b0b3747450085b1cd920c22ec82c18d9311bd folder1
040000 tree 33298295f646e8b378299191ce20b4594f5eb625 folder2
040000 tree dec82bad6283fc7fcc869c20fdea9f8588a2f1b2 folder3
040000 tree 4544967c6b04190f4c95b516ba8a86cab266a872 folder4
$ git ls-tree dec82bad6283fc7fcc869c20fdea9f8588a2f1b2
100644 blob 67bda6df733f6cd76fc0fc4c8a6132d8015591d8 fileA
100644 blob 4cb7272c9e268bfbd83a04e568d7edd87f78589c fileB
100644 blob ce9e0f2cc4d3b656fa30340afbdfed47fe35f3ef fileC
$ git ls-tree 4544967c6b04190f4c95b516ba8a86cab266a872
100644 blob d64fe3add8328d81b1f31c9dbd528956ab391fb6 fileD
100644 blob d1ebd7df7082abc5190d87caa821bf3edb7b68e8 fileE
100644 blob bb6cd264e47a3e5bc7beadf35ea13bac86024b02 ...
100644 blob 995d622b9012f4ef69921091d1e1a73f32aa94e6
100644 blob 9141dbd2b1c7931a6461195934b6599f5dfb485a
100644 blob ab128da1d82907cd0568448dc089a7996d5f79d3
100644 blob 57b11a7eb408a79739d2bb60a0dc35c591340d18
100644 blob 118105291c1c6ca4a01744889ffafbb018bc7ed3
100644 blob 86b1dfda56d0603f16910228327751f869d16bdc
100644 blob 077fe0cddde0d0be9d0974f928f66815caca7b76
100644 blob c0b32fd0450f21994bdc53ea83d3cf0bccd74004
100644 blob 37b87a4d11453468c4ae04572db5d322cd2d1d80
100644 blob 79d39f8d4e57fa3a71664598a63b6dfd88149638
100644 blob ee07bbe3e8cb5d6bb79fb0cd52cfbc9bd830498d files
$ git ls-tree 33298295f646e8b378299191ce20b4594f5eb625
100644 blob f9d6f45cd028aec97f761f00c5f4f2f6b50fb925 MoreFiles
100644 blob 0cb9eed1d0dd9214d54a03af1bda21f37b8c0d02
100644 blob 198e4f97ece735cce47b7e99b54f1b5fa99fabf5
100644 blob fc004212fa8e483e5a8ab35b508027c7a9a1cbfa
100644 blob 0c7d74c7a9a8337b4a9f20802b63d71d42287f89
$ git ls-tree 4a8b0b3747450085b1cd920c22ec82c18d9311bd
100644 blob 0320f5b23dd7cce677fac60b9ad03f418cff5c88 oneLASTfile
$ git log --raw --all
fatal: object 016660b7605cfc2da85f631bbe809f7cb7962608 is corrupted
$ cat packed-refs
cat: packed-refs: No such file or directory
$ git fsck --full
fatal: object 016660b7605cfc2da85f631bbe809f7cb7962608 is corrupted
$ git fsck --full`
error: HEAD: invalid sha1 pointer 016660b7605cfc2da85f631bbe809f7cb7962608
error: refs/heads/RPG does not point to a valid object!
dangling tree 2c1033501b82e301d47dbf53ba0a199003af25a8
dangling blob 531aca5783033131441ac7e132789cfcad82d06d
dangling blob 74a47ff40a8c5149a8701c2f4b29bba408fa36f5
dangling blob b8df4d9751c0518c3560e650b21a182ea6d7bd5e
dangling blob fc2d15aead4bd0c197604a9f9822d265bb986d8b
$ git log
fatal: bad object HEAD
$ cat packed-refs
cat: packed-refs: No such file or directory
$ git fsck --full
error: HEAD: invalid sha1 pointer 016660b7605cfc2da85f631bbe809f7cb7962608
error: refs/heads/RPG does not point to a valid object!
dangling tree 2c1033501b82e301d47dbf53ba0a199003af25a8
dangling blob 531aca5783033131441ac7e132789cfcad82d06d
dangling blob 74a47ff40a8c5149a8701c2f4b29bba408fa36f5
dangling blob b8df4d9751c0518c3560e650b21a182ea6d7bd5e
dangling blob fc2d15aead4bd0c197604a9f9822d265bb986d8b
答案 0 :(得分:18)
好的,好的。我们可以从第二条错误消息中看到您移动的损坏对象是提交。 (HEAD指着它!)不幸的是,这意味着很难手动修复它。 (“硬”我的意思是可能不可能,除非你能够准确记住提交消息是什么以及你提交的时间。)幸运的是,这确实意味着使用相同的文件内容很容易恢复新的提交 - 你会只需要为它写一条新消息。
在开始之前,请查看.git/HEAD
的内容 - 如果它是分支名称,请记住以后的内容。
首先,我们需要弄清楚这个提交的父级应该是什么。您可以使用git reflog
查看HEAD的reflog,并在提交016660b之前找到HEAD所在的SHA1。看起来应该是这样的:
016660b HEAD@{n}: commit: <subject of commit>
1234abc HEAD@{n-1}: ...
您可以复制HEAD先前位置的SHA1,并检查该提交:
git checkout 1234abc
然后,您可以在树中读取已损坏的提交:
git read-tree 2c1033501b82e301d47dbf53ba0a199003af25a8
然后提交!
git commit
现在,这里有一些问题,关于你的分支机构应该发生什么。如果HEAD指向一个分支(比如master),而这个分支又指向了损坏的提交,我们肯定想解决这个问题:
git branch -d master # remove the original master branch
git checkout -b master # recreate it here
如果还有其他分支包含损坏的提交,您也必须对它们进行一些修复 - 如果您需要帮助,请告诉我。
答案 1 :(得分:9)
FWIW,这里的答案比其他关于损坏的git
回购的问题上的许多绝望乐观的答案更实用 - 其中大部分都做出了毫无根据的假设,即穷人OP可以&# 39;只需从远程原点重新克隆!&#39;嗯。 但是。等一下。如果我是原产地怎么办?
故事开始的时候,试图运行一个简单的git gc --aggressive
显示,我不知道,在某些时候我的 - 完全是本地的 - git
回购已经完全被软化:它无法登录几个月之前的任何事情,从而失去了大部分的历史,每当被问到git fsck --full | grep -v dangling
时都会尖刻地尖叫。 git fsck
确定了几个对象丢失了。
git-repair
:尽量减少自2014年以来可怕的体力劳动恐慌之后,发现很多问题与过度投票的糟糕答案只是说“只是从远程来源重新克隆!”#39; - 这一点,让我说明问题,我不知道因为我是起源 - 我找到git-repair
,做了一个简单的sudo aptitude install git-repair
,然后让它做所有繁琐的自动修复工具,可能需要花费数小时(请:在您的损坏的回购[duh]的副本上运行,没有--force
!)
这有助于减少git fsck --full | grep -v dangling
报告的恐怖数量。但是8月中旬以后的事情仍无法实现。
特别是,这一切似乎都围绕着一个无法检索的提交。我怎么能恢复它?搜索Stack Overflow并没有多大帮助!
在这里,我很幸运能够从11月底开始有一个备份。你需要备份,对吧?在我的情况下,它是repo的手动拉链(我的每日备份程序是一些可怕的增量tar
我从未真正测试过的东西... a-cough)......但是,它,它,它很好。它没有遭受任何侮辱我生活回购的侮辱。
但缺少的对象似乎并没有简单地存储在这个备份.git/objects/XY/RESTOFHASHBLAHBLAHBLAH
中。这可能是因为它是提交,而不是文件。我不知道! git
对我来说是个巫术,永远超出了我理解的能力。我只需要快速修复。这不是我们为什么都在这里的原因吗?
现在有了备份,我有一个非常愚蠢的想法,说“这不可能有效!”并立即发现只是天真地运行cp -fr /path/to/repo_backup/.git/objects/* /path/to/repo_git-repaired/.git/objects
到将备份的.git/objects
目录合并到我已损坏的,一些修复过的回购中的对应文件中... ...用于恢复所有历史记录 - 直接回到好的&#39; initial commit lol
。证明修复:git fsck --full
现在也很高兴(尽管有所有悬空部分)。
然后我将现场/已损坏,部分修复,看似已恢复的回购的备份备份到一个单独的驱动器上,以防我再次需要它们。
你应该在运行它之前仔细检查这种方法和命令,或者找一个我懒得想的更好的方法。我不知道。但对我来说,它保存了我的回购。关于第二次猜测我说的话......
现在,显然所有这些都带有警告:你必须在你的损坏的回购副本上尝试所有内容,阅读所有文档,考虑比我更谨慎(强迫{ {1}}命令),并不要让我对任何出错的事情负责或承担责任* ...但它会给你一些更好的尝试,而不是从远程来源重新克隆!&#39; ,对吗?
cp
但是,如果一切都正确,那么可能会有大笔捐款。 ;)
如果有人需要我,我会在我的磁盘驱动器的大方向上发出可疑的声音,希望能够提出一个不会花费两位数时间来恢复的备份例程(如果有的话) ),甚至可能会睡一觉。
答案 2 :(得分:5)
我遇到了同样的问题。但是,通过更改服务器上的.git / objects文件夹和子文件夹(递归)的权限,解决了我的问题。类似的东西:
chmod -R 770 .git/objects
我认为这不是你的问题,但就我而言,它已得到解决。