gitリポジトリをshallowに変換

  • 環境 git-1.7.4
$ git clone --depth=1 https://hoge.com/hoge/hoge.git

とかでリポジトリをshallowクローンできるのは知っていたのですが、通常のリポジトリを簡単にshallow化する方法を発見したのでメモメモ。

$ git clone https://hoge.com/hoge/hoge.git hoge
$ cd hoge

$ git log --oneline | wc -l
540

$ du -sh .git
144M .git

hogeは架空のリポジトリです。普通にcloneしたらこのリポジトリは540コミット、144Mほどの容量でした。
んで、shallow化します。

$ git fetch --depth=1

$ git log --oneline | wc -l
2

$ du -sh .git
144M .git

fetchに--depthを入れるだけでコミット数が2に!しかしリポジトリの容量がまだ変わっていません。

$ git gc
$ du -sh .git
292M .git

$ git prune
29M .git

これでリポジトリの容量もそれなりのサイズになりました。gcしたときにいったんファイル数が増えるのが謎なんですが、gc/pruneをあたりを勉強して出なおすことにします。
ちなみにshallowリポジトリはclone元に使えないのでどうしてもそこからcloneしたい場合は再度すべてのコミットをfetchすれば良いです。

$ git fetch --depth=1000
$ git log --oneline | wc -l
540

cloneだと--depth=0で全部fetchしてくれるんですが、fetchはダメみたい。コミット数をかるく超える値を突っ込めば全部取って来てくれるようです。

いま読んでます