VCS比較

Last-modified: 2009-09-15 (火) 20:50:19

インストール

git
簡単だが,既にmsys,cygwin,ActivePerl等を利用している人は共存設定でハマりやすいので注意
hg, bzr
簡単

動作速度

git > hg >= bzr が定説
ただしバージョンアップ等によって変動するので参考程度に

日本語ファイル名

ファイル名をバイナリ透過に扱うか、Unicode文字列として扱うか。バイナリ透過に扱う場合、Windowsでコミットしたファイル名はcp932で保存されるのでLinuxでチェックアウトすると文字化けする。

git
ファイル名はバイナリ透過。クロスプラットフォームでの日本語ファイル名利用は諦めたほうがよい
hg
ファイル名はバイナリ透過。fixutf8拡張を使えばWindowsでもutf8ファイル名のリポジトリを扱えるが、アドホックな対応で実績が無いのが不安なのと、非標準なので統一が面倒。できるだけクロスプラットフォームでの日本語ファイル名を避けるのが無難。0x5c問題(「表.txt」など)だけを解決するwin32mbcsが標準で付属している。
bzr
ファイル名はUnicode文字列。svnと同じ感覚で利用可能。(ただし、pluginや周辺ツールにまだ問題が残っているかも知れない)

空ディレクトリ

git, hg
追跡対象に含めない
bzr
追跡対象に含める

ネットワークプロトコル対応

git
?
hg
http(s), 独自プロトコルなど。hg serveをすると、branchできるhttpサーバー兼普通のリポジトリブラウザになるのが特徴的。http使用時のパフォーマンスはgit,bzrと比べて優れているらしい(Google Codeがhgを採用した理由の一つ)
bzr
http(s), sftp, ftp, 独自プロトコル(bzr:)など充実。ただし、パフォーマンスは独自プロトコルが優れているのに対してhttpはイマイチ。アップロードはsftp,公開は.bzrディレクトリをそのまま静的ファイルとしてhttpで閲覧可能にしておけばサーバー側にbzrのインストールが不要なので、無料レンタルサーバーも利用可能。

ブランチの切り替え

git
hg
bzr
リポジトリとブランチを切り離すことが可能。リポジトリ内で複数のブランチをcheckoutし、他のブランチで作業したいときは普通にcdをするのが一般的。 gitのような管理も可能 <http://bazaar-vcs.org/GitStyleBranches>

Web UI

git
gitweb (同梱), cgit (別アプリ。それなりに使われる)
hg
hg serve (内包)
bzr
loggerhead (別アプリ、プラグインとして実行する場合、 bzr serve --http のように使える)

スタンドアロンGUI

git
gitk(同梱)
hg
?
bzr
QBzrとbzr-gtk(Olive)がある。公式インストーラではQBzrがインストールされる。
QBzrもbzr-gtkも、q**/g** (**はlog, annotate, commit など) というように通常のコマンドのGUI版を提供している。たとえばqcommitを使うと、コミットするファイルをチェックボックスで選択したり、addを忘れたファイルを追加することができる。
また、エクスプローラライクの統合型インタフェースとして、Olive(bzr-gtk付属) と bzr-explorer (bzr-gtkやqbzrと連携する統合GUI)がある。

シェル統合GUI(Tortoise)

git
TortoiseGit。まだ不完全。
hg
TortoiseHG
bzr
公式のWindowsインストーラでインストール時に選択可能。QBzrを呼び出す形になっている。現在experimentalで、TortoiseBzrだけで作業を完結するのは不可能(ファイルの移動、リネームができない等)。TortoiseBzrなしでQBzrを使うことをおすすめする。

svn連携

git
git-svnでsvnリポジトリを外部リポジトリとして扱うことができる。タグもbranchに見えてしまう。大規模プロジェクトのcloneにかかる時間は?
hg
開発中だがまだ実用レベルになっていない。svn co, hg init, して並行管理するのが一般的?
bzr
bzr-svnでsvnリポジトリを外部リポジトリとして扱うことができる。bzrのタグがsvn上のtags/タグ名に変換されたり、ほぼ完璧。パフォーマンスに問題があったが、最新版ではほぼ解決されている。

cherrypick

cherrypick とは、ブランチを丸ごとマージするのではなくてブランチの一部分をマージする機能。trunkに対するコミットのうち、バグ修正だけをメンテナンスbranchにmergeするという使い方をする。
ファイル、ディレクトリの移動の追跡ができると、例えばJavaでパッケージ名を変更した後のコミットをパッケージ名変更前に切られたbranchにマージできる。

git
git cherrypick 可能。ファイル名変更後の変更は?、ディレクトリ移動後の変更は?
hg
標準添付されているtransplantプラグインを有効にすれば、hg transplantコマンドで可能。ファイル名変更後、ディレクトリ移動後の変更はcherrypick不可。
bzr
bzr merge -r10..12 で [10,12] のコミットをcherrypick可能。単一リビジョンの場合は bzr merge -c10(コマンド名、オプション名はsvnと同じ)。ファイル変更後の変更やディレクトリ移動後の変更もmergeできる。

trac

git, hg
○ (複数リポジトリは面倒)
bzr
○ (複数リポジトリはsvnと同等)

個人公開リポジトリ置き場

git
github (無料で300MB, wiki, ticket)
hg
bitbucket (無料で150MB、 wiki, ticket)
bzr
launchpad (無料無制限、 ticket, Q&A管理, アイデア管理, GetText共同翻訳, ML, チーム)

著名なユーザー

git
Linux, gnome, gcc, Ruby on Rails
hg
Python, Java, NetBeans, OpenSoralis
bzr
Ubuntu, MySQL, GNU(bzrはGNU公式プロジェクトの一つ)

そのほか・備考

  • 今のところ人気は、たぶんgit>=hg>bzr
  • gitのコマンド体系は、一般的なバージョン管理システムと比べるとやや独特。慣れが必要