バージョン管理システムのリポジトリサイズ
移転しました。
自動的にリダイレクトします。
Subversion/Git/Mercurial/Bazaarとありますが、それぞれのリポジトリのサイズを調べてみました。
それぞれ、初期状態、1MBのファイルを1個、10個、100個のファイルを追加してリポジトリのサイズの増え方を比較しました。
結果、Mercurialだけがファイル数に応じて大きくなる傾向があるようです。
考察
リポジトリの実装は、今のところGitしかわかりませんので偏った考察ですが...
Gitは、履歴の管理をブロブとインデックスで記録します。
ブロブは、ファイルの内容をSHA1ハッシュ値にしたファイル名にファイルの内容を圧縮した情報を記録します。
したがって、同じ内容のファイルがいくつ追加されてもファイルの内容は1つしか記録されず、インデックスだけが追加されます。
同じファイルをいくつも追加する今回の比較は、Gitに一番有利な比較と言えます。
バージョン
比較したバージョンは、以下のとおりです。
bazaarは、--quietオプションがなかったです。
$ svn --version --quiet 1.6.6 $ git --version --quiet git version 1.7.0.4 $ hg --version --quiet Mercurial - 分散構成管理ツール(バージョン 1.4.3) $ bzr --version Bazaar (bzr) 2.1.1 Python interpreter: /usr/bin/python 2.6.5 Python standard library: /usr/lib/python2.6 Platform: Linux-2.6.32-30-server-x86_64-with-Ubuntu-10.04-lucid bzrlib: /usr/lib/python2.6/dist-packages/bzrlib Copyright 2005-2010 Canonical Ltd. http://bazaar-vcs.org/ bzr comes with ABSOLUTELY NO WARRANTY. bzr is free software, and you may use, modify and redistribute it under the terms of the GNU General Public License version 2 or later. Bazaar is part of the GNU Project to produce a free operating system. $
比較方法
Subversionは、svnadmin createコマンドで作成したリポジトリのサイズを計測しました。
Git/Mercurial/Bazaarは、それぞれトップディレクトリの.git/.hg/.bzrのサイズを計測しました。
リポジトリの作成と初期サイズ
それぞれのリポジトリの初期サイズです。
Mercurialが一番小さく16KB、最大は、Subversionで148KBでした。
$ svnadmin create svn-repo $ svn co file://`pwd`/svn-repo svn リビジョン 0 をチェックアウトしました。 $ git init git Initialized empty Git repository in ~/git/.git/ $ hg init hg $ bzr init bzr Created a standalone tree (format: 2a) $ du -sk svn git/.git hg/.hg bzr/.bzr | sort -n 16 hg/.hg 84 bzr/.bzr 100 git/.git 148 svn-repo $
1MBのファイルを1つ追加
下記で作成したサイズが1MBの0で埋まったデータを追加してみます。
$ dd if=/dev/zero of=zero-1mb bs=1024 count=100 100+0 記録始め 100+0 記録終わり 102400 バイト (102 kB) コピー終了, 0.00135318 s, 75.7 MB/s $
1MBのファイルを追加します。
$ for i in svn git hg bzr > do > ln zero-1mb $i > (cd $i; $i add zero-1mb; $i commit -m "Add zero-1mb") > done A (bin) zero-1mb 追加しています (バイナリ) zero-1mb ファイルのデータを送信しています . リビジョン 1 をコミットしました。 [master (root-commit) e57d0da] Add zero-1mb 1 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 zero-1mb adding zero-1mb Committing to: ~/bzr/ added zero-1mb Committed revision 1. $
それぞれのリポジトリのサイズを計測しなおします。
$ du -sk svn-repo git/.git hg/.hg bzr/.bzr | sort -n 52 hg/.hg 108 bzr/.bzr 156 git/.git 156 svn-repo
1MBのファイルを10個追加
$ for i in svn git hg bzr > do > for j in $(seq 1 10) > do > ln zero-1mb $i/zero-1mb-$j > (cd $i; $i add zero-1mb-$j) > done > (cd $i; $i commit -m "Add zero-1mb-[1-10]") > done A (bin) zero-1mb-1 A (bin) zero-1mb-2 A (bin) zero-1mb-3 A (bin) zero-1mb-4 A (bin) zero-1mb-5 A (bin) zero-1mb-6 A (bin) zero-1mb-7 A (bin) zero-1mb-8 A (bin) zero-1mb-9 A (bin) zero-1mb-10 追加しています (バイナリ) zero-1mb-1 追加しています (バイナリ) zero-1mb-10 追加しています (バイナリ) zero-1mb-2 追加しています (バイナリ) zero-1mb-3 追加しています (バイナリ) zero-1mb-4 追加しています (バイナリ) zero-1mb-5 追加しています (バイナリ) zero-1mb-6 追加しています (バイナリ) zero-1mb-7 追加しています (バイナリ) zero-1mb-8 追加しています (バイナリ) zero-1mb-9 ファイルのデータを送信しています .......... リビジョン 1 をコミットしました。 [master (root-commit) 4b3fa0d] Add zero-1mb-[1-10] 10 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 zero-1mb-1 create mode 100644 zero-1mb-10 create mode 100644 zero-1mb-2 create mode 100644 zero-1mb-3 create mode 100644 zero-1mb-4 create mode 100644 zero-1mb-5 create mode 100644 zero-1mb-6 create mode 100644 zero-1mb-7 create mode 100644 zero-1mb-8 create mode 100644 zero-1mb-9 adding zero-1mb-1 adding zero-1mb-2 adding zero-1mb-3 adding zero-1mb-4 adding zero-1mb-5 adding zero-1mb-6 adding zero-1mb-7 adding zero-1mb-8 adding zero-1mb-9 adding zero-1mb-10 Committing to: ~/bzr/ added zero-1mb-1 added zero-1mb-10 added zero-1mb-2 added zero-1mb-3 added zero-1mb-4 added zero-1mb-5 added zero-1mb-6 added zero-1mb-7 added zero-1mb-8 added zero-1mb-9 Committed revision 1. $
$ du -sk svn-repo git/.git hg/.hg bzr/.bzr | sort -n 88 hg/.hg 108 bzr/.bzr 156 git/.git 160 svn-repo $
さらに89個追加
$ for i in svn git hg bzr; do for j in $(seq 11 100); do ln zero-1mb $i/zero-1mb-$j; (cd $i; $i add zero-1mb-$j); done; (cd $i; $i commit -m "Add zero-1mb-[10-100]"); done
$ du -sk svn-repo git/.git hg/.hg bzr/.bzr | sort -n 168 bzr/.bzr 172 git/.git 200 svn-repo 448 hg/.hg $