2016-06-09 63 views
1

當我運行:Git的REV-列表找不到提交

git verify-pack -v .git\objects\pack\pack-*.idx 

輸出的線路之一包含:

651302358b781ab60f364416272e1c35107c974f blob 23980089 23987383 699599322 

但是,如果我試圖查找與該斑點:

git rev-list --all --objects | grep 651302358b781ab60f364416272e1c35107c974f 

或者:

git rev-list --all --reflog --objects | grep 651302358b781ab60f364416272e1c35107c974f 

我只是得到一個空的結果。我應該無法查找由verify-pack返回的任何斑點嗎?

根據以下我試圖:創建一個新的克隆,運行git repack運行git gc但結果相同。

回答

2

該對象可能被放棄,即它的最後一個引用,無論它們是什麼,現在都消失了。因爲該對象位於包文件中,所以不能簡單地將其刪除。 Git必須構建一個全新的包。

如果您使用git repack來構建新的包文件,則新包中將忽略任何未引用的對象。 (注意:git gc會自動執行此操作。然而,.keep文件可能保留老包左右,如果你已經創建.keep文件。)

編輯:作爲jthill points out in a comment,你必須用-a-A重新包裝,以鞏固舊的包。雖然在某些情況下自動git gc將提供-A,但它是only when the number of pack files exceeds gc.autoPackLimit,其中defaults to 50

+0

我確實嘗試過使用git gc,但它沒有任何效果,仍然git verify-pack找到了無法用rev-list查找的blob。並且git repack給出了「沒有新的包裝」。我也試圖再次克隆,同樣的「鬼」對象存在。 – u123

+0

也許它是從reflog條目引用的。嘗試'git rev-list --all --reflogs'查找步驟(同時保留'--objects')。雖然,如果它出現在最初的「克隆」上,那有點奇怪,因爲克隆不會複製引用日誌。 – torek

+0

$ git rev-list --all --reflogs --objects | grep 651302358b781ab60f364416272e1c35107c974f不起作用。似乎rev-list不知道--reflogs選項 – u123

0

我發現這在git幫助存儲的底部,以查找未提交的提交。

git fsck --unreachable | 
grep commit | cut -d\ -f3 | 
xargs git log --merges --no-walk --grep=WIP