SubversionからGitへ移行しようとして日本語ファイル名(UTF8)に困ったことある方に

LINEで送る
Pocket

みなさん、こんにちは
kaoruです。
前回に引き続き、Gitに絡んだお話です。
今までSubversionを使っていたけど、そろそろGitに移行しようと考えておられる方も多いのではないでしょうか。
Gitのパッケージの中にgit-svnというモジュールがあるため、SubversionからGitへは比較的容易に移行できます。また、GitからSubversionレポジトリへのコミットも可能なため、一時的に相互運用することも可能になっています。
しかし、ここに大きな落とし穴がありSubversionレポジトリーにドキュメントファイルなど、ファイル名が日本語のファイルがあると文字化けしたりエラーになったりしてうまくいかないのです。
少なくとも以前はそういう状態でした。
しかし、今ではCygwin版Gitを使うという選択肢があります。後ほど、実際にコマンドを実行しながら、日本語のファイル名が文字化けせずに扱えることをご紹介します。
まずは、技術的背景と以前はどのような問題が発生していたかを説明します。
Subversionは内部的にファイル名をUTF8で扱います。
(こちら参照:http://www.open.collab.net/scdocs/SVNEncoding.html.ja
Git は内部的にファイル名をバイナリ文字列として扱い文字エンコーディングを関知しません。
(こちらのDiscussion参照:http://www.kernel.org/pub/software/scm/git/docs/v1.7.2.1/git-log.html) すなわち、日本語版WindowsではShift_JISになっていました。
Subversionにコミットしたファイルをgit-svnを使って、Git管理に移行すると、ファイル名の文字エンコーディングはUTF8のまま変換しようとしますが、日本語版WindowsではShift_JISでないといけなかったため、問題が発生しました。
before.gif
しかし、日本語版Windowsでも最新版のCygwinを使えばファイル名をUTF8として扱うことが出来ます。つまり、Cygwin上で動くGitとSubversionは同じUTF8の文字エンコーディングを利用できます。
after.gif
以下に、実際に試してみた手順を 紹介します。
まず、 Cygwin の最新版と、 Cygwin 版の Git をインストールしました。
バージョン表示は以下のようになります。

kaoru@ALIEN% uname -a
CYGWIN_NT-6.1-WOW64 ALIEN 1.7.6(0.230/5/3) 2010-08-16 16:06 i686 Cygwin
kaoru@ALIEN% git --version
git version 1.7.1

影響があるかどうかはわかりませんが、環境変数 LANG は、 UTF8 に設定しました。

kaoru@ALIEN% echo $LANG
en_US.utf8

また、 Cygwin に接続する際には putty を利用し、 putty の文字コードの設定は、UTF8 に設定しました。
次に、 git svn clone コマンドで日本語ファイル名を含む Subversion レポジトリーをクローンして Git レポジトリーとしました。
yumewaza-git-svn-clone.gif
ls -al コマンドで確認しましたが、日本語のファイル名が正しく再現されていることが確認できました。
ls-al.gif
エクスプローラー上からも文字化けせず日本語ファイル名が利用できました。
explorer.gif
次にファイルを変更後、 git status を実行すると、日本語ファイル名がエスケープされて表示されました。
git-status-escaped.gif
これは少し不便ですので、エスケープしないように設定してみます。

git config --bool core.quotepath false

これで、ちゃんとファイル名が読めるように表示されました。
git-status.gif
次に、 git commit で日本語のコミットメッセージを入力してファイルをコミットし、
git log で確認しましたが、正常に表示されました。
git-commit.gif
最後に、今までの変更を、 Subversion に反映させるために、 git svn dcommit を実行したのですが、筆者の環境ではトラブルが発生し、 unable to remap … といったエラーメッセージが表示されました。
unable_to_remap.gif
最初は驚くかもしれませんが、このようなエラーが表示された場合解決策がありますので心配ありません。
まず、 Cygwin から起動したすべてのプロセスを終了させ、通常のコマンドプロンプトから、

cd C:cygwin
binash.exe
/bin/rebaseall

とコマンドを実行すればOKです。
rebaseall.gif
作業を再開しましょう。
git svn dcommit コマンドで、 Git レポジトリーの変更を、 Subversion レポジトリに反映し、 svn log -v コマンドで、 Subversion レポジトリのログを確認したところ、日本語のコミットログ、日本語のファイル名のいずれも正しく反映されていることがわかりました。
git-svn-dcommit.gif
以上のような手順により、Cygwin版Gitを利用すれば、Gitで日本語ファイル名を扱うことができ、git-svnを利用することで、Subversionとの連携も可能になることがわかりました。
今まで、日本語のファイル名が原因でSubversionからGitへの移行を躊躇っていたレポジトリについても道が開けたのではないかと思います。
本来Cygwinを使わずに対応したいところなので、もっとスマートな方法を模索中です。より良い方法がありましたら、またご紹介させていただきます。

Comments are closed.