2012-07-22 51 views
15

我的一個克隆庫的從混帳得到這個fsck的如何移除「致命:鬆散物體」?

fatal: loose object 40bda4e3b79c3d7bf598df31d9e68470f97a3f79 (stored in .git/objects/40/bda4e3b79c3d7bf598df31d9e68470f97a3f79) is corrupt

我有它的另一副本的fsck的乾淨。

我已經嘗試nuking包含致命的目錄/子目錄,並 recloning它。問題仍在繼續。

我真的不在乎任何特定的文件,我只是想要清理存儲庫到 結帳。我該怎麼辦?

注意:遠程存儲庫託管在github上。

+0

你可以克隆原始存儲庫? – 2012-07-22 01:01:20

+0

可能的重複:http://stackoverflow.com/questions/4254389/git-corrupt-loose-object – tiwo 2012-07-22 01:02:17

+0

也是http:// stackoverflow。com/questions/8438620/git-pull-fatal-loose-object – 2012-07-22 01:06:53

回答

23

簡單的答案:將舊的回購移走並回收。如果你想保留舊回購庫中的東西,有辦法讓他們,但首先得到一個很好的回購。

+0

我nuked倉庫/目錄結構並recloned。問題依然存在。還有另一種方法可以將舊的回購「移動」出去嗎? – fishtoprecords 2012-07-22 01:09:34

+0

@fishtoprecords:'git fsck'返回失敗,對吧?然後'cd ..; mv reponame reponame-fatal-loose-object; git克隆網址reponame' – 2012-07-22 01:11:03

+0

謝謝,我發誓我曾經這樣做過,但這一次它運行良好。 – fishtoprecords 2012-07-22 01:11:42

3

首先,你可以檢查文件系統錯誤:fsck -y

然後,檢查的Git倉庫:git fsck

-3

簡單的答案是 「室射頻git的......」 http://www.bazhukov.net/2015/02/git-corrupt-loose-object/

+0

這個環節是俄羅斯。我不認爲任何理智的軟件傢伙都能夠使用它。 – user23573 2015-07-20 07:04:55

+0

當看到損壞的消息使用這些命令: 1.室射頻的.git 2. GIT中的init 3. git的遠程添加原點repository_address 4. GIT中取 5. GIT中的復位 - 硬起源/主 – bo858585 2015-07-20 22:56:25

+4

請DON '做到這一點,或者只有在你知道你在做什麼時才做。最後的'reset --hard'步驟會讓你失去存儲庫中任何未提交的更改。 – Chaosed0 2015-07-31 14:49:10

0

執行git checkout到另一個分支,您將獲得已更改文件的列表,只需提交併推送到分支。 如果你這樣做,問題將得到解決,下一次當你做一些改變git status應該工作。

3

的理念是:

  1. 先刪除駐留在你的.git當前項目在你當前的git記錄(讓我們表示它通過「項目A」)。
  2. 複製您當前的項目,我們將該副本表示爲「項目B」。
  3. 現在cd進入項目A和git克隆並重置爲最後一次提交。
  4. 所有文件從B項目複製並替換那些在項目A.
  5. 現在cd爲項目A和使用git status看項目A的狀態應該是一樣,如果沒有腐敗發生過。

簡而言之,製作一份副本以保留當前的工作區域,並通過替換文件將其與新鮮克隆合併,然後像平常一樣處理您的更改。

這是它在行動:

  1. 首先,我看到我有一個腐敗(這是因爲我inproperly昨天強迫我的虛擬機停機:P):

    ✘domicor @ Ubuntu的〜 /點文件主●git的狀態 錯誤:對象文件的.git /對象/ CD/593f6db1d5050406e15b9c80d215fd48db39f4是空 錯誤:對象文件的.git /對象/ CD/593f6db1d5050406e15b9c80d215fd48db39f4是空 致命:鬆散對象cd593f6db1d5050406e15b9c80d215fd48db39f4(存儲英寸混帳/對象/ CD/593f6db1d5050406e15b9c80d215fd48db39f4)已損壞 corrupted

  2. 讓我dotfiles文件夾的副本,現在刪除.git文件夾。

    $ CD〜/點文件 $室射頻git的

    dotfiles

  3. 然後重新創建一個混帳回購協議。

    $ git init

  4. 添加遙控器。

    $ git的遠程添加原產[email protected]:domicor/dotfiles.git

  5. 從遠程獲取。

    $混帳取

    下面是上述命令的截屏:rm-clone-fetch

  6. 現在重置HEAD。

    $ git的復位 - 硬起源/主

    這是拍:那之後我從遠程獲取我發出了git status命令來檢查我的回購的狀態reset

    通知。你可以看到所有的文件都未被跟蹤。命令行提示符的第一部分是從我的git init命令橙色到git reset命令指示當我初始化我的回購,git檢測到的文件,並在重置後,所有文件都恢復到HEAD的狀態,從而綠色提示。

  7. 設置上游分支:

    $ git的分支--set-上游到原點= /主主

  8. 現在您的文件從備份文件夾複製(對我來說這dotfiles (copy))手動或通過命令行來替換dotfiles文件夾中的文件。退房的狀態,並應該有變化,就像我的屏幕截圖:

    final

  9. 現在你可以git diff your-filename檢查出來,如果你的變化是正確應用,你可以從現在開始添加文件和提交。 \ o/

爲了更好地理解它,git VCS只是記錄您的更改。當VCS損壞時,您的文件仍然安全。當你離開他們時,他們仍然在那裏。因此,您可以備份文件並從其他位置恢復git記錄,並且git可以將恢復副本與當前文件狀態進行比較,並瞭解發生變化的原因,就像它發生損壞之前所做的一樣。和歡呼聲\\/

+0

謝謝您的詳細解答,這是迄今爲止最有用的解決方案!我已經使用''rsync -ria --progress /* /「'複製我的更改。 – 2016-11-06 18:26:38

+1

btw - 你在這裏用什麼樣的git-aware bash-prompt? 編輯:發現它,ZST的Agnoster(https://github.com/agnoster/agnoster-zsh-theme) – 2016-11-06 18:32:36