2009-10-02 75 views
37

我在我的git倉庫收到此錯誤:如何處理這個混帳錯誤

22:09:15 $ git status 
# On branch master 
error: Could not read 8124cc15c63be92d534e4cdfa33c38d54deee122 
error: unable to read tree object HEAD 
nothing to commit (working directory clean) 

一個谷歌搜索error: unable to read tree object HEAD不會造成太大的幫助,這個錯誤似乎是非常罕見的。我不知道如何處理它。它可能是一個硬盤驅動器故障?

編輯: 的git fsck輸出如下:

broken link from commit 607328dc80e4901a55b95c683d4fbf43e6df28bf 
       to tree 8124cc15c63be92d534e4cdfa33c38d54deee122 
missing tree 8124cc15c63be92d534e4cdfa33c38d54deee122 
dangling tree 56b5d4a5e429d251582ec927bca7ef1225510c41 
dangling tree 0259d2d38b18b6136bb6070fb41faf3624453cc6 
+0

聽起來像某種腐敗。你嘗試過'git fsck'嗎? – 2009-10-02 02:20:21

回答

20

一個 「斷鏈」 的消息,你可以按照GitFaq recommendations

  • 備份所有狀態,以便你做的任何事情都是可重做的,如果你更多的腐化事物!
  • 爆炸任何損壞的包,文件
    • 請參閱「man git-unpack-objects」,特別是「-r」標誌。
      另外,請認識到它只解開那些尚不可用的對象,因此您需要首先將包文件從其正常位置移開(否則git-unpack-objects會查找包中包文件中的所有對象-file本身,而不是在所有的內容解壓任何東西)
  • 更換任何損壞的和/或遺失物件
    • 這是具有挑戰性的部分。
      有時(希望經常!)您可以在存儲庫的其他副本中找到丟失的對象。
      在其他時候,您可能需要嘗試以其他方式查找數據(例如,也許您的簽出副本包含散列時將丟失的對象的文件內容?)。
  • 確保一切都滿意 「git fsck --full
  • 改裝一切又回到一個有效的狀態

注:

更新2016年7月(7個laters),使用Git 2。10即將發佈,你現在有:

git fsck --name-objects 

它有助於命名那些損壞的鏈接

請參閱「How to fix git error broken link from tree to tree?」更多的由來。

+0

只是想起你所鏈接的GitFaq已經壞掉了。 – 2012-02-19 19:54:13

+0

@ChrisWilson:謝謝。鏈接已恢復。 – VonC 2012-02-19 20:00:47

+0

@VonC它又被打破了。這裏是正確的鏈接https://git.wiki.kernel.org/index.php/GitFaq – MikeKusold 2012-07-24 19:46:36

4

我有同樣的問題。經過大量的頭髮拉動,我發現這是由於更改了存儲庫的git文件的權限。我已經解決它如下:

$ cd .git 
$ chmod 755 * 

完成!

+0

這是我的情況的原因,但雖然你的建議會阻止它發生,但現在這個問題已經發生沒用 - 我的存儲庫已損壞。我通過重命名該項目,從其他地方重新克隆並通過從重命名的項目中複製文件重新創建我已經丟失的幾個提交來修復它。我使用的是較舊的Ubuntu LTS,所以它只有git 1.5.4.3。 – rjmunro 2012-02-01 11:14:59

+3

對我不起作用 – jacob 2014-08-13 02:58:12

+0

上帝保佑你:-) – 2016-08-25 00:45:41

11

我剛纔有一個類似的問題。當我的筆記本電腦在git pull期間發生硬關機時,出現了腐敗現象。我有一個遠程備份庫。首先,我在.git/objects/??/*中有幾個零大小的目標文件。一個cp -a備份庫後,我這樣做:

  • 刪除零長度對象
  • 克隆遠程儲存成​​庫
  • 在破倉庫

    ,我做

    cat ../fresh/.git/objects/pack/pack-*.pack | git unpack-objects

這在填補了缺少的對象對象數據庫。該儲存庫現在似乎已備份。

+0

+1這似乎在我的情況很好 - 謝謝張貼:) – cmhughes 2014-01-04 04:48:33

+0

奇怪的是,Git抱怨說我的包之一是腐敗。我只是使用這個命令解壓縮了這個損壞的包文件,在解包過程中沒有抱怨,現在git fsck又開心了! – thenickdude 2017-04-08 20:26:36

+0

謝謝!這對我有效。 – galactica 2017-08-11 18:29:44

1

如果沒有未提交的更改最簡單的解決方法是刪除本地分支: 的Git分支-D [分支名]

,然後再結賬遠程分支: git的結帳-b [分支名稱]原產地/ [分公司名稱]

2

我的Homebrew install的Git存儲庫中出現類似錯誤。我沒有逐一恢復所有丟失的對象,而是簡單地刪除.git目錄並通過從Homebrew’s public repository重新克隆來重新創建目錄。這些是我的步驟:

  • 檢查你的Git存儲庫中有哪些信息是你通過重新克隆得不到的。對我來說,這是私人的分支,窗扇和遙控器。
    • 通過創建一個新的分支,應用隱藏,並在名稱中加入類似「[WIP]」的內容,以將隱藏轉換爲實際提交以表明它是隱藏的。
    • 通過將不在公共遠程的分支推送到您自己的遠程分支來保存分支。這可能是GitHub上存儲庫的分支,或者是機器上不同位置的新Git存儲庫。
    • 如果您有多個遙控器,請保存git remote -v的輸出,其中包含遙控器的名稱和URL,以便您以後可以手動添加它們。
  • 刪除您repoistory的.git目錄(或者其重命名爲.git-broken後來刪除)。在命令行上,這是rm -rf .git
  • git clone https://github.com/Homebrew/homebrew.git或任何URI重新克隆遠程目錄。
  • 這將創建一個新的子文件夾homebrew,以存儲庫命名。你只需要那個.git目錄;你的本地文件已經好了。所以mv homebrew/.git .git,然後刪除homebrew文件夾。
  • 你的Git倉庫應該沒有錯誤,因爲你從頭開始重新創建它。現在只需恢復您在第一步中保存的任何信息。
    • 如果您有其他遙控器,請使用git remote add <name> <url>再次添加遙控器。
    • 如果您將任何分支(或轉換爲分支的存儲)備份到遠程存儲庫,請將其從該存儲庫中提取到本地存儲庫。
    • 如果需要,可以通過滾動git reset HEAD^的「[WIP]」提交將存儲分支轉換回存檔,並將工作目錄保存爲git stash save <custom-message>

如果運行git fsck,你應該看到沒有錯誤:

$ git fsck 
Checking object directories: 100% (256/256), done. 
Checking objects: 100% (197135/197135), done. 
Checking connectivity: 197162, done. 
$ 

而且git stash listgit branchgit remote -v像以前應該顯示相同的輸出。

0

我通過在同一個目錄/項目文件夾改變固定的錯誤,然後試圖提交新的變化,發生了什麼事是我得到了一個錯誤味精「無效的對象100644 e38e910ceb18b09f436f353c3a131bfe2caba130爲」書/ alise_mathe /應用/ src目錄/ main/res/menu/drawermenu.xml' 這個msg解決了這個問題,我只是通過將文件名改爲'drawer_menu.xml'來重構drawermenu.xml。添加了承諾推動的變化,這就是所有。 (機器人工作室)

我希望這有助於一些如何

0

我從我的遠程服務器目錄中刪除Capistrano的「回購」文件夾中修復了這個錯誤。我遇到了一些其他的建議問題,並解決了這個問題並不在我的本地項目中。當Capistrano執行回購操作時,問題似乎就出現了。對我而言,這可能是由於停止部署造成了損壞的對象/對象引用。我的主機也剛剛完成了服務器遷移,可能在這個過程中被破壞了。