2011-03-11 66 views

回答

81
  • 如果您添加了文件然後刪除它們,斑點仍然存在但是懸空。 git fsck將列出無法訪問的斑點,並且git prune將刪除它們。

  • 如果您添加了這些文件,提交了這些文件,然後回滾了git reset --hard HEAD^,那麼它們會陷入更深的困境。 git fsck將不會列出任何懸而未決的提交或blob,因爲您的分支的reflog持有他們。下面就來確保只有在你的歷史合適的對象會保持一個辦法:

    git reflog expire --expire=now --all 
    git repack -ad # Remove dangling objects from packfiles 
    git prune  # Remove dangling loose objects 
    
  • 另一種方式也是克隆庫,因爲這將只執行其中可達的對象。但是,如果晃來晃去的對象得到了包裝(如果你執行許多操作,git的很可能自動包裝),然後是本地克隆將攜帶整個打包文件:

    git clone foo bar     # bad 
    git clone --no-hardlinks foo bar # also bad 
    

    您必須指定一個協議,迫使GIT中計算一個新的包:

    git clone file://foo bar # good 
    
+0

是的,我注意到這個問題之前沒有提交。除了最後一條命令之外,我已經嘗試了一切。當我從我的項目目錄中運行這個「警告:你似乎已經克隆了一個空的存儲庫。」我一直在閱讀文檔,但它很重要。我如何將克隆指向正確的源? – light24bulbs 2011-03-11 20:26:21

+1

@user的'文件:// URL foo'是相對於當前目錄和'文件:///家/我/ foo'(三個斜槓)是絕對的。 – 2011-03-11 20:43:45

+0

謝謝!這個尺寸縮小了一半,但是我的包仍然是存儲庫其餘部分的十倍。我試着修剪.. – light24bulbs 2011-03-11 21:12:59

4

如果您還有修剪及重新包裝(gc --aggressive --prune=tomorrow ...),那麼你可以簡單地去尋找奇一出後,大量回購:

git rev-list --objects --all | 
    while read sha1 fname 
    do 
     echo -e "$(git cat-file -s $sha1)\t$\t$fname" 
    done | sort -n 

這會給你一個按升序大小排序的對象列表。你可以使用git-filter-branch從你的repo中刪除罪魁禍首。

請參閱「刪除對象」在http://progit.org/book/ch9-7.html指導

+0

@DavidJames感謝<的提示。我把它更可讀,IMO – sehe 2012-08-13 11:39:14

+0

就在在這個情況下,任何人的旅行:有一個在括號中的ARGS一個錯字:應該是'--aggressive'。試圖編輯,但事實證明,你不能編輯這樣一個小的錯字。 – hellobenallan 2015-11-26 09:35:37

+0

@hellobenallan感謝紙條,[固定](http://stackoverflow.com/posts/5293344/revisions) – sehe 2015-11-26 09:46:46

7

Sparkleshare在我的git中創建了13GB的tmp_pack_文件,無法將多次巨大的映像簽入。唯一有幫助的是......

rm -f .git/objects/*/tmp_* 

'git gc'沒有刪除這些文件。

+0

這是一個漂亮的蠻力解決方案,但我看不出有任何理由它不會工作。太好了! – light24bulbs 2015-05-11 21:30:57

+0

絕望的情況需要絕望的措施,它像一個魅力工作!韓國社交協會。 – medina 2016-08-12 00:36:00