30

今日リポジトリを開こうとしましたが、コミット履歴がありませんでした。私が試したすべて(git status、git log、git checkout ...)は、破損したオブジェクトに関するエラーをスローしました。

私はこの問題をオンラインで調査し、Linus Torvaldsによる記事を見つけましたが、壊れたリンクIDを見つけた時点で迷子になりました。私のファイルID、ツリー、ブロブのいずれも、エラーメッセージによってスローされた原因IDと一致しません。

次に、 「ハードディスクの障害によって損傷したgitオブジェクト」の回復に関する記事に戻り、(原因のオブジェクトを邪魔にならないように移動した後)次のように処理しました。

$ cat packed-refs

その時点で私のコンピュータは言った:cat: packed-refs: No such file or directory 私はそのステップをスキップして

$ git fsck --full

適切な出力を取得しましたが、犯人(または犯人と呼んでいたもの、エラーによってスローされたsha1 ID)をバックアップリポジトリからメインリポジトリにコピーし、不足しているオブジェクトをからコピーすることになりました。私が知る限り、バックアップリポジトリをメインリポジトリに追加します。そして、私はあまり大胆なことをしたくありません。さもないと、後で強制できないことを強制するかもしれません。

だから私の質問は、バックアップを作成することになっていたのか(ああ、初心者アラート)、それとも.packファイルを解凍したときに何が起こったのかということです。そして、私がコピーしている「犯人」は、実際にはクリーンなファイル、つまり破損していないファイルですか?

(最初は、Torvaldsのファイルの「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

.packファイルを解凍した後:

$ 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
4

3 に答える 3

19

そして。2番目のエラーメッセージから、移動した破損したオブジェクトがコミットであることがわかります。(HEADがそれを指していた!)残念ながら、これは手動で修復するのが難しいことを意味します。(「ハード」とは、コミットメッセージが何で、何時にコミットしたかを正確に思い出せない限り、おそらく不可能を意味します。)幸い、これは、同じファイルの内容で新しいコミットを簡単に復活できることを意味します。新しいメッセージを書くだけです。

始める前に、-の内容を確認してください.git/HEAD。ブランチ名の場合は、後で覚えておいてください。

まず、このコミットの親がどうあるべきかを理解する必要があります。git reflogHEADの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がブランチ(たとえばマスター)を指していて、そのブランチが破損したコミットを指していた場合は、間違いなくそれを修正したいと思います。

git branch -d master       # remove the original master branch
git checkout -b master     # recreate it here

破損したコミットを含む他のブランチがある場合は、それらに対しても復元を行う必要があります。サポートが必要な場合はお知らせください。

于 2010-09-01T14:37:04.960 に答える
15

FWIW、これは、破損したリポジトリに関する他の質問に対する多くの絶望的に楽観的な回答よりも実用的な回答ですgit-そのほとんどは、貧弱なOPが「リモートオリジンから再クローンできる」という根拠のない仮定を立てています! うーん。しかし。一瞬待って。私がオリジンだったら?

ホラー

ストーリーは、シンプルなものを実行しようとしたときに、git gc --aggressiveある時点で、私の知らないうちに、完全にローカルなgitレポが何らかの形で完全に停止したことを明らかにしたときに始まります。数か月前を超えて何もログに記録できなかったため、歴史、そして求められるたびに喉を鳴らしましたgit fsck --full | grep -v dangling。によって失われたと特定されたオブジェクトがいくつかありますgit fsck

git-repair: 2014 年以来、恐ろしい手作業を最小限に抑えています。

パニックに陥り、「リモートオリジンから再クローンしてください!-これは要点を説明さgit-repairsudo aptitude install git-repairください。破損したレポのコピー[当たり前]、なし--force!)

これは、によって報告された恐怖の量を減らすのに役立ちましたgit fsck --full | grep -v dangling. しかし、8月中旬以降はまだ到達できませんでした。

特に、これはすべて、取得できなかった 1 つのコミットに集中しているように見えました。どうすれば回復できますか?Stack Overflow を検索してもあまり役に立ちませんでした。

バックアップがありますよね?

ここは、11 月末からバックアップを取得できた幸運な場所です。バックアップを取りますよね?私の場合、それはレポの手動 zip でした (私の毎日のバックアップ ルーチンは、tar実際にテストしたことがない恐ろしいインクリメンタルなものです... 咳)...しかし、ふー、それで十分でした。私のライブレポを苦しめたどんな侮辱も受けていませんでした。

しかし、行方不明のオブジェクトは、単にこのバックアップの に保存されているようには見えませんでした.git/objects/XY/RESTOFHASHBLAHBLAHBLAH。これはおそらく、ファイルではなくコミットだったためです。知らない!git私にとっては魔法であり、私の理解力を永遠に超えています。すぐに修正が必要でした。それが私たち全員がここにいる理由ではありませんか?

バックアップからオブジェクトを復元します (持っていますよね?)

バックアップが手元にあると、私はばかげた愚かな考えを思いつき、「これが機能する方法はありません!」と言って、すぐに単純に実行cp -fr /path/to/repo_backup/.git/objects/* /path/to/repo_git-repaired/.git/objectsして、バックアップのディレクトリを私の破損した対応するディレクトリにファイルマージすることを発見しました-やや-.git/objects修復されたレポ... すべての履歴を回復するために働きました-すぐに古き良きものに戻りinitial commit lolます。修正を証明する:git fsck --full今も幸せでした (ぶら下がっているすべてのビットにもかかわらず)。

次に、再度必要になった場合に備えて、ライブ/破損した、部分的に修復された、一見回復したリポジトリのバックアップを別のドライブに作成しました。

実行する前にその方法論とコマンドを再確認する必要があります。または、私が考えるのが面倒なより良い方法を見つける必要があります。知らない。しかし、私にとっては、それは私のレポを救いました。そして、私が言うことを推測するという主題について...

無限の組み合わせによる無限の免責事項

さて、これには明らかに注意点があります。破損したレポのコピーですべて試し、すべてのドキュメントを読み、私よりも少し注意する必要があります (その強制cpコマンド)。絶対にうまくいかないことは何でも* ...しかし、「リモートのオリジンから再クローンするだけ!」よりも試してみたほうがよいことがありますよね?

*ただし、すべてがうまくいけば、多額の寄付が必要になる可能性があります;)

誰かが私を必要としている場合、私はディスク ドライブの一般的な方向を怪しげに睨みつけます。うまくいけば、復元するのに 2 桁の時間もかからないバックアップ ルーチンを考え出すでしょう。寝る。

于 2016-12-21T01:53:41.663 に答える
6

私も同じ問題を抱えていました。ただし、サーバー上の.git / objectsフォルダーとサブフォルダーのアクセス許可を(再帰的に)変更することで、私の問題は解決しました。何かのようなもの:

chmod -R 770 .git/objects

それはあなたの問題ではないと思いますが、私の場合は解決しました。

于 2011-12-28T12:52:53.693 に答える