2013-07-11 25 views
2

我已經失去了一個腐敗的庫提交對象,但仍然有一些文件和樹對象:我可以在git中檢出樹對象嗎?

$ 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 
+0

是否'git的結帳4b825dc642cb6eb9a060e54bf8d69288fbee4904'的工作? – Ryan

回答

3

如果這種情況經常發生,或者您需要從其他提交中來回切換,則可以創建一個指向此樹的新提交對象,然後創建一個指向它的新分支以方便使用:

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每當你需要......

+0

這個和@ sehe的答案都是完美的,但如果我想要的是將狀態恢復到存儲庫,這個更加實用。 – Penz

1

嘗試

git read-tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 

或有點清潔

git read-tree --prefix=rescue --index-output=/tmp/rescue.index b825dc642cb6eb9a060e54bf8d69288fbee4904 

把它放在一個子文件夾(救援)。

一定要檢查該樹指的是什麼,它可能不是版本庫的根路徑:

4

如果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" 

給它一個承諾和分支通過解決這一問題。

+0

整潔。我不知道'git checkout'可能需要一個樹id而不是commit-ish。玩這個 – sehe

相關問題