4

破損したリポジトリで commit オブジェクトを失いましたが、まだいくつかのファイルとツリー オブジェクトがあります。

$ git fsck                                                
Checking object directories: 100% (256/256), done.
dangling blob 031be26142ed97da216fb7d79d16a0b0efdf0d71
dangling blob 4b2be7dfef082c2e247be52e6d78600af7b6dd40
dangling tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904
dangling blob ccbb1056cb4e744f9a4b44a439fa036f6a3d7cbe
dangling blob 10bfbc3c1fa10e08cd6a783565f00e7324f61fe5
dangling blob 9b529957be714fef304c4e8161fe6cd138510e98
dangling blob dd5b54882d0b74db99c8a7fbba703d528dc559b9

そのツリーオブジェクトをチェックアウトする方法はありますか?

ダミーのコミット文字列を使用してコミット オブジェクトを再構築し、それを確認する方法があると思います。

git cat-file -p tree-sha1
4

3 に答える 3

6

もしあなたがgit checkout 4b825dc642cb6eb9a060e54bf8d69288fbee4904 .(パス名のドットは重要です。そうでなければ、git はそれをブランチ切り替え操作と解釈して拒否します)、作業ディレクトリインデックスの両方のすべてのファイルを 4b825d の状態に一致するように更新します... (つまり、git diff何も表示されず、git diff --staged多くの変更git statusが表示され、多くの M が表示されます)。その方法でファイルの状態を調べることができます。

関連する親コミットを推測している場合は、次のことができます

git checkout -b recover relevant_parent
git checkout 4b825dc642cb6eb9a060e54bf8d69288fbee4904 .
git commit -m "Recovered this thing that git fsck told me about"

それに対処するためのコミットとブランチを提供します。

于 2013-07-11T21:24:39.403 に答える
4

これが頻繁に発生する場合、または他のコミットから前後に切り替える必要がある場合は、このツリーを指す新しいコミット オブジェクトを作成してから、便宜上それを指す新しいブランチを作成できます。

git commit-tree <<treeid>>
<<type a commit message>>
^D
<<this will produce a hash for the new commit object>>
git branch newbranch <<newcommithash>>

そうすれば、必要なときにいつでもできるはずgit checkout newbranchです...

于 2013-07-11T23:13:41.833 に答える