ksaitoの日記

日々試したことの覚え書き

バージョン管理システムのリポジトリサイズ

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
$