バージョン管理システム比較

提供: Software Development Memo
移動先: 案内検索
注意 : このページ「バージョン管理システム比較」は、現在書きかけの状態です。完成版に向けて、今後加筆・修正します。また、本ページの内容は全体的な整合性が取れていない可能性があります。

本ページは、各バージョン管理システムをソフトウェア開発基盤として使用する場合の特徴を比較した内容を記述します。取り上げるバージョン管理システムは、最もメジャーなSubversion、そして分散バージョン管理システムであるGit、Mercirual、Bazaarです。

2011年3月現在、私が構築しているソースコードと仕様書のバージョン管理システムにはSubversionを使用しています。本ページは、分散バージョン管理システムに移行できるかの判断材料として使用します。

前提条件

  • 管理対象
    • ソースコード
      • ファイル名・ディレクトリ名は半角英数字のみ
      • テキストファイル
    • 仕様書
      • ファイル名・ディレクトリ名は日本語を含む
      • 基本的にはバイナリファイル(Microsoft Excel等)
  • OS : Windows 7 Enterprise 64bit (32bitも可)
  • 使用するIDE
    • Visual Studio 2010 Profesional : C#
    • Pleiades All in One 3.6.2.20110228 : Java
  • GUIフロントエンドを優先的に使用

比較対象

分散バージョン管理システムのメリット

あくまで私の主観です。

  • 中央リポジトリからの独立したバージョン管理
    • 他人はまだ公開したくないが、一時的にコミットをしたい状況に対応
  • 他リポジトリと常時に繋がっている必要が無い
    • 外出する際に持ち出したデータに対してもバージョン管理ができる

マージの容易性に関しては、そのような機会が少ないので、個人的にメリットを享受するまでに至っていません。

比較結果

Subversion連携

Subversionを親リポジトリとして使用する場合の、使用ツール(プラグイン)およびコマンド例を記述します。

  • Git
  • Mercurial
    • hgsubversionをインストール
  • Bazaar
    • チェックアウト・コミット・プッシュは、特にSubversionであることを意識せず操作可能


特記事項

  • Gitのクローン時のコマンドを「git svn clone file:///c:/work/svn-repos」とすると、「(前略)Expected FS format '2'; found format '4'(以下略)」と出て操作が失敗します。git-svnで扱えるSubversionファイルシステムのバージョンが古いためにエラーが出たと推測します。
  • Mercurialのクローン元URLを「C:\...」と指定すると失敗するので「file:///C:/...」とする必要があります。

バイナリファイルに対する操作性

バージョン管理されているバイナリ(非テキスト)ファイルの、過去の履歴を閲覧するときの操作性に関する比較です。

  • Git
    • TortoiseGitの「Show log」画面の下部から、過去のバイナリファイルを関連付けされたアプリケーションで直接開ける
    • UIがTortoiseSVNに近い
  • Mercurial
    • 過去のバイナリファイルはWindowsメモ帳でしか開けない。
      • メモ帳で開いたファイルをそのまま保存してもファイルが破損していて開けない。
    • リビジョンごとのエクスポートで代替するしかない
  • Bazaar
    • QBzrの履歴の「ファイル表示」を選択しても、専用ビューアが開き、外部保存および関連付けされたアプリケーションによる表示はできない

日本語ファイル名・ディレクトリ名の取り扱い可否

Subversionでは特に問題なく使用できた日本語ファイル名・ディレクトリ名が、特にGit・Mercurialでは問題が出てきます。

調査がかなり中途半端なので、後日追加調査します。

  • Git
    • ディレクトリ名は文字化けする
      • 影響範囲は要調査
    • ファイル名は問題無し
  • Mercurial
  • Bazaar
    • 特に問題なし
    • エラー発生時のダイアログ(何のエラーかは失念)に出力されるメッセージに含まれる日本語パスが文字化けしているが、影響不明

日本語を含む作業用ディレクトリ名

(調査中)

IDE連携

(調査中)

名前 Visual Studio 2010 Eclipse 3.6 (pleiades) 備考
Subversion
Git
Mercurial
Bazaar

その他

特になし。

前提条件を満たす散バージョン管理システム

ソースコード管理

  • Visual Studio 2010
    • (調査中)
  • Eclipse 3.6
    • (調査中)

仕様書管理

GUIフロントエンドからの過去のバイナリファイルの取得ができ、かつ日本語ファイル名・ディレクトリ名の取り扱いができる分散バージョン管理システムはありません。よって、Subversionが最も適しています。

まとめ

(考察中)

参考資料

RedmineとBazaarを組み合わせて過去のバイナリファイルを取得する

RedmineとBazaarを組み合わせることにより、過去のバイナリファイルの取得と日本語ファイル名・ディレクトリ名の取り扱いが可能となります。

ただし、常にRedmineにアクセスできる環境が必要となります。

Compare version control 01.png

Bazaarの設定。

Compare version control 02.png

Windowsからファイルをコミット。文字化けは回避しています。

Compare version control 03.png

ダウンロードもできます。

QBzrでファイルの保存をするためのパッチ

BazaarのGUIフロントエンドであるBazaar Explorer(QBzr)には、ファイルを保存するための機能がありません。暫定処理ではありますが、QBzrのソースコードを書き換えて保存する機能を加えました。その時のdiffは以下となります。

注意 : 私はPython、PyQt等の開発作法を理解していません。もしかしたらリソースリーク等が発生するかもしれません。

編集するファイルは「<Bazaarホーム>\plugins\qbzr\lib\cat.py」です。

=== 変更 ファイル cat.py
--- cat.py	2011-03-20 17:11:57 +0000
+++ cat.py	2011-03-20 17:22:16 +0000
@@ -86,6 +86,11 @@
 
         self.throbber = ThrobberWidget(self)
         self.buttonbox = self.create_button_box(BTN_CLOSE)
+        self.save_button = QtGui.QPushButton("Save(&S)", self)
+        self.connect(self.save_button,
+                     QtCore.SIGNAL("clicked()"),
+                     self.save_file)
+        
         self.encoding_selector = self._create_encoding_selector()
 
         self.vbox = QtGui.QVBoxLayout(self.centralwidget)
@@ -94,6 +99,7 @@
 
         hbox = QtGui.QHBoxLayout()
         hbox.addWidget(self.encoding_selector)
+        hbox.addWidget(self.save_button)
         hbox.addWidget(self.buttonbox)
         self.vbox.addLayout(hbox)
 
@@ -110,7 +116,21 @@
         # we show the bare form as soon as possible.
         QBzrWindow.show(self)
         QtCore.QTimer.singleShot(0, self.load)
-    
+
+    def save_file(self):
+        filePath = QtGui.QFileDialog(self, QtCore.Qt.Dialog).getSaveFileName(self, "Save File", self.filename)
+        if not filePath:
+            return
+        
+        file = QtCore.QFile(filePath)
+        file.open(QtCore.QIODevice.WriteOnly)
+        
+        try:
+            file.write(self.text)
+        finally:
+            file.flush
+            file.close
+
     @runs_in_loading_queue
     @ui_current_widget
     @reports_exception()

Compare version control 04.png

左下に「Save」ボタンが追加され、クリック時にファイルダイアログが表示されます。

更新履歴