2015-05-28 19 views
5

概述:如何修復損壞的Git倉庫 - 「混帳fsck的」報告「樹警告[哈希值]:包含的條目指向空SHA1」

我無法在我們的回購成功拉改變我們的生產服務器。

運行「混帳的fsck」在我的回購返回相同的錯誤的5個實例:

warning in tree [hash]: contains entries pointing to a null sha1 

我們的回購,包括託管到位桶版本的所有版本中存在的錯誤。

我和我的同事都對我們非常想保留的本地版本的回購協議進行了無節制的和未提交的更改。

我試過google,stackoverflow和man page,但是我找不到一個很好的指南來解釋發生了什麼或者如何解決這個問題。

談到GIT時,我和我的同事是相對的小菜鳥。我們已經掌握了基礎知識,但是我們還沒有花費時間在低級命令上。

我很感激任何和所有幫助恢復我的回購完整性。

詳細描述:

我的問題,當我試圖遠程分支拉我的生產服務器啓動。它應該是工作目錄的簡單更新,但我得到了一些模糊的錯誤,我不記得並發現我的工作目錄已損壞。

Git狀態報告失敗合併後未跟蹤和修改文件的噸數。我無法弄清楚如何用git命令解決問題,所以我手動操作文件系統來刪除文件(但我沒有碰到.git目錄中的任何東西),並讓我的工作目錄恢復到我的工作目錄生產服務器將無誤地爲我的網站服務。

運行 「混帳的fsck」 在我的回購返回相同的錯誤的5個實例:

warning in tree [hash]: contains entries pointing to a null sha1 

我跑的git的fsck上:

  • 我的回購我的開發機器上
  • 我同事的dev機器
  • 在dev和prod上的bitbucket的新鮮克隆版本回購

我試過的一切都顯示了同樣的警告。所以不管是什麼問題,它都在我們的回購版本中。

呼喚「混帳LS-樹[樹哈希報告錯誤]」顯示了與壞樹哈希沿着正常的目錄打印:

160000 commit 0000000000000000000000000000000000000000 [name of repo] 

最接近的一個解決方案,我發現是這樣的計算器職位: How to remove an entry with null sha1 in a Git tree。但是,我無法真正理解這些步驟,切割和粘貼命令無法解決我的問題。

我的問題:

  • 什麼這些錯誤究竟意味着什麼?他們有多嚴重?
  • 我們如何修復我們的回購(如果可能請爲我們的noobs一步一步做)?
  • 在我們修復之前或之後,我們是否應該承諾並推行所有對回購的更改?
  • 修復回購有什麼含義?我們如何將修復分發到所有版本的回購(例如開發機器和生產服務器)?
  • 是什麼導致了這個錯誤,我們如何防止它再次發生?
+0

事實證明,我的桌面上的RAM開始拋出錯誤(memtest86失敗)。我相信糟糕的RAM損壞了我的GIT提交,當我推動更改時,所有內容都被損壞了。 –

回答

0

這個問題很舊,仍然,也許它可以幫助別人。

  • 這個錯誤可能意味着你有一次子模塊,後來擺脫了它們,出了點問題。
  • 如何修復很大程度上取決於所涉及的樹木是什麼樣子的。關鍵是要理解git內部,足以找出要做什麼。這實際上並不是很難,因爲git從根本上只有少數概念。退房https://git-scm.com/book/en/v2/Git-Internals-Git-Objects。你鏈接的問題有非常好的指針回答。
  • 我會做這樣的:
    • 複製一個本地副本(使用你的操作系統文件的工具,而不是GIT)你的資料庫,然後做在副本git reset --hard,然後搞定一切。
    • 將此固定存儲庫發送到一個新的遙控器,以便您的朋友可以拿起它。
    • 你們倆都從原始倉庫複製你的本地修改,再次使用cp而不是git。
    • 像往常一樣提交,推,拉,直到這三個新的存儲庫都很好。 - 丟棄舊的本地存儲庫,用git push --all --force替換舊的遠程存儲庫。
  • 影響取決於實際修復的複雜程度。但它可能會媲美巨大的債務重組,即I.e.新的提交哈希到處都是,git給你提供了「分支分支」消息,其間有數百次提交。你不應該失去歷史。我建議不要在新舊版本庫之間推/拉/合併。
  • 原因可能是一些子模塊的惡作劇,因爲子模塊是導致提交哈希出現在樹中的一件事。爲了避免...避免子模塊?很難說。
+0

感謝您的回答。我們最終通過編輯庫來修復它(我不記得所有的細節)。 –