2012-09-24 32 views
17

接收到該錯誤之前立即我做了以下:固定腐敗鬆散對象作爲在GIT中提交

[email protected]:~/file/path$ git add * 
[email protected]:~/file/path$ git push 
^C 
[email protected]:~/file/path$ git commit -m "my commitmesg" 

(I慌因爲忘記添加推動之前提交,所以我CNTRL + c'ed 。它

現在,我收到的git fsck的-full以下錯誤:

error: inflate: data stream error (incorrect header check) 
error: corrupt loose object '5cdeb9c3a1fe164cb4d2779d1e0d9d9f4ef18c6a' 
fatal: loose object 5cdeb9c3a1fe164cb4d2779d1e0d9d9f4ef18c6a (stored in .git/objects/5c/deb9c3a1fe164cb4d2779d1e0d9d9f4ef18c6a) 

混帳貓文件-t 5cdeb9c3a1fe164cb4d2779d1e0d9d9f4ef18c6a返回此對象是提交

搜索後,我發現如果對象是blob,但是如果它是提交則不是如何解決此問題。

回答

16

首先,對現有存儲庫進行備份。 cp -r什麼的。這樣,如果您嘗試修復您的存儲庫,則可能會導致恢復。

最簡單的嘗試就是用工作的文件替換該損壞的目標文件。如果您有存儲庫的備份,請使用它。否則,請從遠程存儲庫執行git clone以獲取全新副本並將.git/objects/5c/deb9c3a1fe164cb4d2779d1e0d9d9f4ef18c6a複製到您現有的已損壞副本中。看看是否修復它。

+0

我在github上有我的回購,但他們沒有我嘗試提交的這些更改(在這一點上,我不在乎我是否永遠失去它們,但是如果可能,寧願獲取它們)。我從我的gh repo克隆,但它的.git目錄中沒有任何對象。 :/ –

+7

對象被打包。用'git unpack-objects .git/objects/pack/*。pack'將它們解壓到單個文件中。 – Schwern

+2

如果git unpack-objects命令不執行任何操作「**如果在目標存儲庫中存在的包文件上使用此命令,則不會解壓縮任何內容。」 ([git docs](http://git-scm.com/docs/git-unpack-objects))。 要解壓縮對象,只需使用'git init'創建一個新的repo,然後運行命令以從剛剛創建的存儲庫中解壓縮包文件(來自克隆存儲庫)。 – svallory

7

感謝您回覆。我在新克隆的repo中運行了它,並返回它解壓100%的對象,但它們不在該回購的.git/objects/pack中。

所以,相反,今天早上嘗試了一些工作。 1.將我的github資源庫克隆到一個單獨的新目錄中。 2.將本地更改的文件(我最初想提交的文件)複製到新克隆的存儲庫中,然後將它們推送到github。 3. nucked我的舊本地存儲庫,並4.再次克隆到我有我的舊存儲庫相同的文件路徑。

+0

雖然這個響應是舊的,但它在我的情況下有效,並且無法壓縮respository(通過GitGUI)。在我複製本地文件之前,我添加了一個步驟 - 稱之爲(1a) - 通過GitGUI壓縮對象。這個過程是成功的(最後!),之後我更新了本來想要提交併成功提交的本地對象。謝謝! – NWdev

0

簡單回答這個問題的人面臨這樣的問題: 的混帳克隆命令修復,如果有一個遠程回購然後將其複製到本地文件夾(刪除損壞的本地倉庫後),如果你沒有遠程回購然後嘗試推動腐敗回購github,然後從那裏克隆它,我認爲,不會推動損壞的對象,它會解決問題

3

非常類似於Schwerm的答案,但我不得不初始化將.pack文件解壓縮到的新回購:

git clone <repo-uri> my_repo.fresh_clone 
mkdir my_repo.newly_unpacked 
cd !$ 
git init 
for pack_file in ../my_repo.fresh_clone/.git/pack/*.pack; do 
    git unpack-objects < $pack_file 
done 

然後我複製了my_repo.newly_unpacked/.git/objects/<xx>/<sha1>的文件,如錯誤消息所示。我被抓到了,因爲一些操作,如git checkout顯示比簡單的git status更多的丟失對象,所以最好在清理之前保留一些恢復目錄。

0

我也有類似的問題,當系統做一個提交前墜毀。幸運的是,我所要做的就是將完整的repo再次克隆到一個新的目錄中,並丟棄舊的目錄。

新克隆的回購沒有損壞的.git/objects /#num /#散列文件。

相關問題