2013-02-05 64 views
13

我相信,我的Git庫是不是在良好的狀態,其中,當我做了如何修復的Git零填充文件模式警告

git fsck 

我會在頂部以下警告。

103b5dd53f7a96f8e3a02aea0d3d4d9bb19644ed: contains zero-padded file modes 
bb4729593e76f66b46292ad6ae61bfe909558337: contains zero-padded file modes 
4709aa73691ce7da36dd22ccfd157c4514395330: contains zero-padded file modes 

我嘗試了以下(由同事建議)找到違規提交,以便我可以糾正它們。我嘗試了以下方法。

  1. 通過所有提交從git rev-list HEAD
  2. 對於每個提交,請執行git ls-tree -rd以查找所有相關對象SHAs
  3. 看看其中的任何一條,與git fsck中的上述條件匹配。

上述邏輯對我來說似乎是正確的,但它無法找到違規提交。

git rev-list --all --remotes | while read commit; do git ls-tree -rd $commit | grep -E "103b5dd53f7a96f8e3a02aea0d3d4d9bb19644ed|bb4729593e76f66b46292ad6ae61bfe909558337|4709aa73691ce7da36dd22ccfd157c4514395330" && echo -e "HIT @ $commit\n\n"; done 

我們在這裏錯過了什麼?我們怎麼能找到有問題的提交或文件有問題?最後,我想修復存儲庫。

+0

你試過更簡單的grep:'grep「103b5dd53」',看看是否至少有一個提交出現? – VonC

+0

是的,我一次也做過一次,但沒有出現。 –

+0

所以這些SHA1s應該來自上游回購,有點像http://stackoverflow.com/questions/4864740/github-repo-corruption-sha1-collision – VonC

回答

12

從留言中加入解決方法,因爲答案:

使用git fast-export重建回購,然後git fast-import解決這個問題,但SHA值會發生變化,樹引用不會帶過來。

創建一個新的空庫:

mkdir /newrepo 
cd /newrepo 
git init 

回到舊的使用fsck警告:

cd /oldrepo 

管比使用舊數據快速導出到數據快速導入在新的回購

git fast-export --all | (cd /newrepo && git fast-import) 
+0

有趣的解決方法,比我上面的評論更精確。 +1 – VonC

1

只是補充@ 9000的答案:

git fast-export --signed-tags=strip --all | (cd ../newrepo/ && git fast-import)