

gitを使ってウェブサービス運用を続けていたら年月を重ねたせいかGitリポジトリが肥大化して数ギガバイトを超えるほどに成長しました。
リポジトリの内訳としてはプログラム、画像等のリソース、テキストの設定ファイル等です。 尚、コミット数は数万以上あり、ブランチも多くあるとします。

この大きくなってしまったリポジトリを毎回Cloneするのはとても時間がかかるのでどうにかしたいと考えます。

条件としては

  * なるべく過去の歴史を捨てずに保持したい
  * 画像リソースは外部に移動してもよい

といった場合にどのようにアプローチを行えば素早く、軽いリポジトリにできるのでしょうか？


CC BY-SA 3.0
2014-12-25T05:56:46.557
2546
2014-12-29T05:26:59.497
3023
question
git
肥大化したGitリポジトリにおいて歴史の粒度を落とさずにサイズを減らすには


`git gc` を実行すると過去のコミットが圧縮され、容量を減らすことが出来ます。 `gc.auto` と `gc.autopacklimit`
を設定しておく事で定期的に実行しなくても自動で実行してくれる様になります。
過去に入れてしまったファイルは履歴として消せませんので、普段から「これは大きい」と思ったファイルは `git-media` 等を使って外部リソースに逃がし
sync する方針を取られるのが良いと思います。


CC BY-SA 3.0
2014-12-25T09:40:18.810
2563
2014-12-25T09:40:18.810
440
2546
answer


外に置いても良いと言うことなので、`filter-
branch`で外に置いておく物をリポジトリから完全に削除するのはどうでしょう。しかし、コミットIDは変化してしまうため全員がcloneし直す必要があります。
[使い方はこちらが参考になるでしょう](http://git-
scm.com/book/ja/v1/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E6%AD%B4%E5%8F%B2%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88)

もしくは[サブモジュール](http://git-
scm.com/book/ja/v1/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)化していくつかのリポジトリに分けて管理してしまう手もあります(いまから分けるのは大変かも知れませんが)。


CC BY-SA 3.0
2014-12-25T12:36:53.590
2578
2014-12-25T12:36:53.590
5753
2546
answer


mattnさんが git gc についてはもう既に書いてますが、--aggressive オプションをつける、または

[code]

    git repack -a -d --depth=250 --window=250
    
[/code]

など試されましたか？

結局やっていることは、--aggressiveは計算済みdeltaの再選択、repackは普通以上の深度でのdelta再計算で、必ずしも減る訳ではないらしいですが、普段は緩く比べ、出来るだけdeltaを再利用してるので、効果があるかもしれません。ちなみに二つ目のは[Linusがgccのメーリングリスト](https://gcc.gnu.org/ml/gcc/2007-12/msg00165.html)で言ってたやつで、overnightとか言ってるのでかなり時間がかかると思われますが、--aggressiveと違いちゃんと計算し直すのでやるならこっちだとか。-fオプションを足すと、古いdeltaを再利用しないようにも出来るのでこれもつけた方がいいらしいです。


CC BY-SA 3.0
2014-12-29T05:14:29.770
2768
2014-12-29T05:26:59.497
2014-12-29T05:26:59.497
3974
3974
2546
answer