.gitフォルダーをクリーンアップするにはどうすればよいですか?プロジェクトディレクトリをクリーンアップしましたが、.gitはまだ大規模です


86

誤って生成された数百メガバイトのガベージを削除した後でも、railsプロジェクトディレクトリの.git / objectsはまだ大量です。

git add -Aインデックスを更新し、存在しないファイルを削除するために、他のコマンドと同様に試しました。ディレクトリ内の2つの文字名を持つファイルがblobであると、おそらく間違って収集します。以前のコミットにロールバックしようとしましたが、うまくいきませんでした。

このディレクトリをクリーンアップするにはどうすればよいですか?

回答:


139
  • ファイルを追加してから削除した場合、blobはまだ存在しますが、ぶら下がっています。git fsck到達不能なblobを一覧表示し、git pruneそれらを削除します。

  • ファイルを追加し、コミットしてから、でロールバックすると、ファイルgit reset --hard HEAD^は少し深くスタックします。git fsckブランチのreflogがそれらを保持しているため、ぶら下がっているコミットやblobは一覧表示されません。履歴に適切なオブジェクトのみが残るようにする1つの方法は次のとおりです。

    git reflog expire --expire=now --all
    git repack -ad  # Remove dangling objects from packfiles
    git prune       # Remove dangling loose objects
    
  • もう1つの方法は、リポジトリのクローンを作成することです。これは、到達可能なオブジェクトのみを運ぶためです。ただし、ぶら下がっているオブジェクトがパックされた場合(そして、多くの操作を実行した場合、gitは自動的にパックされた可能性があります)、ローカルクローンはパックファイル全体を運びます。

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

    gitに新しいパックを計算させるプロトコルを指定する必要があります。

    git clone file://foo bar  # good
    

はい、問題に気付く前にコミットしました。最後のコマンド以外はすべて試しました。プロジェクトディレクトリ内からこれを実行すると、「警告:空のリポジトリのクローンが作成されたようです」。私はドキュメントを読んでいますが、それは重いものです。クローンを正しいソースにポイントするにはどうすればよいですか?
light24bulbs 2011年

1
@user file://fooURLは現在のディレクトリを基準にしており、file:///home/me/foo(3つのスラッシュ)は絶対です。
Josh Lee

ありがとう!それは半分のサイズにカットされていますが、私のパックはまだリポジトリの他の部分の10倍のサイズです。私は剪定を試してみた...
light24bulbs

1
@user多くのコミットに誤って大きなファイルがある場合は、git-filter-branchを使用してそれらを選択することをお勧めします。
Josh Lee

2
申し訳ありませんが、効果はありません。私の開発リーダーは、サイズは現在許容範囲内ですが、好ましくない範囲内にあると言っています。スプーンで私に餌を与え続ける時間があれば、それは素晴らしいことですが、あなたは私を立ち直らせてくれました。jleedevに感謝します。
light24bulbs 2011年


15

Sparkleshareは、巨大な画像のチェックインを何度もプルできなかった後、私のgitに13GBのtmp_pack_ファイルを作成しました。助けになったのは...

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

'gitgc'はそれらのファイルを削除しませんでした。


これはかなり強引な解決策ですが、うまくいかない理由はわかりません。いいね!
light24bulbs 2015年

1
絶望的な状況には必死の対策が必要です、それは魅力のように働きました!Tks。
メディナ2016

rmはLinuxコマンド用ですか?Windowsユーザー、次に@catはどうですか?
グムル

7

剪定して再梱包した後もまだ大きなリポジトリがある場合(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を使用して、リポジトリから原因を削除できます。

ガイダンスについては、http://progit.org/book/ch9-7.htmlの「オブジェクトの削除」を参照してください。


@DavidJamesヒントをありがとう。私はそれをさらに読みやすくしました、IMO
sehe 2012

他の誰かがこれにつまずいた場合に備えて:括弧内の引数にタイプミスがあります:する必要があります--aggressive。編集しようとしましたが、そのような小さなタイプミスは編集できないことがわかりました。
hellobenallan 2015年

@hellobenallanメモをありがとう、修正
sehe 2015年

1

再帰的に:

find ./ -iname '*.!*' -size 0 -delete
for i in */.git; do ( echo $i; cd $i/..; git gc --aggressive --prune=now --force; ); done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.