#contents
* インストール [#f1df3c31]
:git|簡単だが,既にmsys,cygwin,ActivePerl等を利用している人は共存設定でハマりやすいので注意
:hg, bzr|簡単
* 動作速度 [#k3bee34f]
git > hg >= bzr が定説
ただしバージョンアップ等によって変動するので参考程度に
* 日本語ファイル名 [#ecf26e0c]
ファイル名をバイナリ透過に扱うか、Unicode文字列として扱うか。バイナリ透過に扱う場合、Windowsでコミットしたファイル名はcp932で保存されるのでLinuxでチェックアウトすると文字化けする。
:git|ファイル名はバイナリ透過。クロスプラットフォームでの日本語ファイル名利用は諦めたほうがよい
:hg|ファイル名はバイナリ透過。fixutf8拡張を使えばWindowsでもutf8ファイル名のリポジトリを扱えるが、アドホックな対応で実績が無いのが不安なのと、非標準なので統一が面倒。できるだけクロスプラットフォームでの日本語ファイル名を避けるのが無難。0x5c問題(「表.txt」など)だけを解決するwin32mbcsが標準で付属している。
:bzr|ファイル名はUnicode文字列。svnと同じ感覚で利用可能。(ただし、pluginや周辺ツールにまだ問題が残っているかも知れない)
* 空ディレクトリ [#xdfd54d0]
:git, hg|追跡対象に含めない
:bzr|追跡対象に含める
* ネットワークプロトコル対応 [#t3ba4834]
: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のインストールが不要なので、無料レンタルサーバーも利用可能。
* ブランチの切り替え [#i800fd54]
:git|?
:hg|?
:bzr|リポジトリとブランチを切り離すことが可能。リポジトリ内で複数のブランチをcheckoutし、他のブランチで作業したいときは普通にcdをするのが一般的。 gitのような管理も可能 <http://bazaar-vcs.org/GitStyleBranches>
* Web UI [#j5582bd6]
:git|gitweb (同梱), cgit (別アプリ。それなりに使われる)
:hg|hg serve (内包)
:bzr|loggerhead (別アプリ、プラグインとして実行する場合、 bzr serve --http のように使える)
//hgwebをもとにbzr-webserveが、それを元にloggerheadの開発が始まったが、すでに全く別物なので特に記述する必要は無いだろう。
*スタンドアロンGUI [#mabb00d6]
: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) [#va510d34]
:git|[[TortoiseGit>http://code.google.com/p/tortoisegit/]]。まだ不完全。
:hg|[[TortoiseHG>http://bitbucket.org/tortoisehg/stable/wiki/Home]]
:bzr|公式のWindowsインストーラでインストール時に選択可能。QBzrを呼び出す形になっている。現在experimentalで、TortoiseBzrだけで作業を完結するのは不可能(ファイルの移動、リネームができない等)。TortoiseBzrなしでQBzrを使うことをおすすめする。
* svn連携 [#cfcbc526]
:git|git-svnでsvnリポジトリを外部リポジトリとして扱うことができる。タグもbranchに見えてしまう。大規模プロジェクトのcloneにかかる時間は?
:hg|開発中だがまだ実用レベルになっていない。svn co, hg init, して並行管理するのが一般的?
:bzr|bzr-svnでsvnリポジトリを外部リポジトリとして扱うことができる。bzrのタグがsvn上のtags/タグ名に変換されたり、ほぼ完璧。しかし、大規模プロジェクトのbranchには長時間かかる。特にhttpで公開されているsvnリポジトリの場合、サーバーの性能によっては数千リビジョンでも半日以上かかることもある。
:bzr|bzr-svnでsvnリポジトリを外部リポジトリとして扱うことができる。bzrのタグがsvn上のtags/タグ名に変換されたり、ほぼ完璧。パフォーマンスに問題があったが、最新版ではほぼ解決されている。
* cherrypick [#y4beb669]
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 [#i7467525]
:git, hg|○ (複数リポジトリは面倒)
:bzr|○ (複数リポジトリはsvnと同等)
* 個人公開リポジトリ置き場 [#n24c0d1c]
:git|github (無料で300MB, wiki, ticket)
:hg|bitbucket (無料で150MB、 wiki, ticket)
:bzr|launchpad (無料無制限、 ticket, Q&A管理, アイデア管理, GetText共同翻訳, ML, チーム)
* 著名なユーザー [#ib78a907]
:git|Linux, gnome, gcc, Ruby on Rails
:hg|Python, Java, NetBeans, OpenSoralis
:bzr|Ubuntu, MySQL, GNU(bzrはGNU公式プロジェクトの一つ)
* そのほか・備考 [#d3a608d3]
- 今のところ人気は、たぶんgit>=hg>bzr
- gitのコマンド体系は、一般的なバージョン管理システムと比べるとやや独特。慣れが必要