「バージョン管理システム比較」の版間の差分
(→仕様書管理) |
(→補足資料) |
||
(同じ利用者による、間の3版が非表示) | |||
140行目: | 140行目: | ||
=== 仕様書管理 === | === 仕様書管理 === | ||
GUIフロントエンドからの過去のバイナリファイルの取得ができ、かつ日本語ファイル名・ディレクトリ名の取り扱いができる分散バージョン管理システムはありません。よって、Subversionが最も適しています。 | |||
== まとめ == | |||
(考察中) | |||
== 参考資料 == | |||
=== RedmineとBazaarを組み合わせて過去のバイナリファイルを取得する === | |||
RedmineとBazaarを組み合わせることにより、過去のバイナリファイルの取得と日本語ファイル名・ディレクトリ名の取り扱いが可能となります。 | |||
ただし、常にRedmineにアクセスできる環境が必要となります。 | |||
[[ファイル:Compare version control 01.png|600px]] | |||
Bazaarの設定。 | |||
[[ファイル:Compare version control 02.png|600px]] | |||
Windowsからファイルをコミット。文字化けは回避しています。 | |||
[[ファイル:Compare version control 03.png|600px]] | |||
ダウンロードもできます。 | |||
== QBzrでファイルの保存をするためのパッチ == | |||
BazaarのGUIフロントエンドであるBazaar Explorer(QBzr)には、ファイルを保存するための機能がありません。暫定処理ではありますが、QBzrのソースコードを書き換えて保存する機能を加えました。その時のdiffは以下となります。 | |||
注意 : 私はPython、PyQt等の開発作法を理解していません。もしかしたらリソースリーク等が発生するかもしれません。 | |||
編集するファイルは「<Bazaarホーム>\plugins\qbzr\lib\cat.py」です。 | |||
<source lang="diff"> | |||
=== 変更 ファイル 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() | |||
</source> | |||
[[ファイル:Compare version control 04.png|600px]] | |||
左下に「Save」ボタンが追加され、クリック時にファイルダイアログが表示されます。 | |||
== 更新履歴 == | == 更新履歴 == |
2011年3月20日 (日) 17:50時点における最新版
注意 : このページ「バージョン管理システム比較」は、現在書きかけの状態です。完成版に向けて、今後加筆・修正します。また、本ページの内容は全体的な整合性が取れていない可能性があります。 |
本ページは、各バージョン管理システムをソフトウェア開発基盤として使用する場合の特徴を比較した内容を記述します。取り上げるバージョン管理システムは、最もメジャーな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
- TortoiseSVN-1.6.14.21012-x64-svn-1.6.16.msi
- Git
- Git-1.7.4-preview20110204.exe
- Tortoisegit-1.6.5.0-64bit.msi
- Mercurial
- TortoiseHg 2.0.2 with Mercurial 1.8.1 - x64 Windows
- Bazaar
- bzr 2.3.1(Standalone版インストール)
分散バージョン管理システムのメリット
あくまで私の主観です。
- 中央リポジトリからの独立したバージョン管理
- 他人はまだ公開したくないが、一時的にコミットをしたい状況に対応
- 他リポジトリと常時に繋がっている必要が無い
- 外出する際に持ち出したデータに対してもバージョン管理ができる
マージの容易性に関しては、そのような機会が少ないので、個人的にメリットを享受するまでに至っていません。
比較結果
Subversion連携
Subversionを親リポジトリとして使用する場合の、使用ツール(プラグイン)およびコマンド例を記述します。
- Git
- git-svn(Gitインストール時に付属)
- クローン時のコマンド(例) :
- git svn clone svn://localhost:8001/test01
- 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メモ帳でしか開けない。
- メモ帳で開いたファイルをそのまま保存してもファイルが破損していて開けない。
- リビジョンごとのエクスポートで代替するしかない
- 過去のバイナリファイルはWindowsメモ帳でしか開けない。
- Bazaar
- QBzrの履歴の「ファイル表示」を選択しても、専用ビューアが開き、外部保存および関連付けされたアプリケーションによる表示はできない
日本語ファイル名・ディレクトリ名の取り扱い可否
Subversionでは特に問題なく使用できた日本語ファイル名・ディレクトリ名が、特にGit・Mercurialでは問題が出てきます。
調査がかなり中途半端なので、後日追加調査します。
- Git
- ディレクトリ名は文字化けする
- 影響範囲は要調査
- ファイル名は問題無し
- ディレクトリ名は文字化けする
- Mercurial
- 日本語ディレクトリの取り扱い不可
- コミット時、「abort: 指定されたパスが見つかりません。」と表示される。
- Redmineから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にアクセスできる環境が必要となります。
Bazaarの設定。
Windowsからファイルをコミット。文字化けは回避しています。
ダウンロードもできます。
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()
左下に「Save」ボタンが追加され、クリック時にファイルダイアログが表示されます。