すでにコミット済みのファイルを無視する & git 軽量化

コード読みたくて clone したら一緒に管理されてる gif やら png やらその他のバイナリファイルも
clone されて DISK 圧迫するからそこら辺は消して無視したい。

gitignore や .git/info/exclude で無視しようとしても、すでにコミットされてるから無視できない。

そんな時は、下記の方法を使う。


1.assume-unchanged

#無視
git update-index --assume-unchanged [ファイル名]

#無視解除
git update-index --no-assume-unchanged [ファイル名]

2.skip-worktree

#無視
git update-index --skip-worktree [ファイル名]

#無視解除
git update-index --no-skip-worktree [ファイル名]


どちらでも、無視してくれる。
2つのコマンドの違いは、無視されたファイルの変更を維持するかどうか。
前者は変更されても、変更されてないと扱う。
なので、リモートのファイルに変更がある状態で git pull するリモートのファイルが取り込まれる。
後者の場合は、取り込まれない。


設定を確認するには、下記のコマンド

git ls-files -v


git pull して、バイナリファイルが戻ってくると嫌なので、
下記のコマンドで、バイナリファイルとかを無視して一括で削除。

find . -type f \( -name \*.gif -o -name \*.swf -o -name \*.png -o -name \*.jpg \) -print0 | xargs -0 git update-index --skip-worktree

find . -type f \( -name \*.gif -o -name \*.swf -o -name \*.png -o -name \*.jpg \) -print0 | xargs -0 rm -f

1.9Gあったリポジトリが、1.2Gまで小さくなった。
git status しても差分は出てこない。

さらに、下記のコマンドを実行すると1.1Gまで小さくなった。

git gc --aggressive

そこそこ満足。
もっと小さくできないかは引き続き調べる。


参考
http://blog.bbtune.com/archives/1329/to-ignore-uncommitted-changes-in-a-file-that-is-already-tracked
http://qiita.com/items/56d0d3ba7a1300625f92
http://d.hatena.ne.jp/stakizawa/20080522/t1
http://techracho.bpsinc.jp/baba/2012_05_22/5594