hnwの日記

濁点ファイル名も扱えるSubversionをMacPortsでインストール

さて、今日はMacを開発環境にしている人なら全員共通の悩みをババーンと解決しますよ!というわけで、濁点や半濁点を含んだファイル名を扱えるようなSubversionMacPortsでインストールします。これは僕の作った野良Portsですが、MacPorts管理になるので他の方法より気軽に導入できると思います。

背景

MacOSXを開発環境にしている人なら直面したことのある状況だと思いますが、svn checkout直後にsvn statusすると次のような不可解な内容が表示されることがあります。

$ svn status
?      docs/濁点だよ.txt
!      docs/濁点だよ.txt


ひらがなの濁点を含むファイル名に関して、1行目はSubversionで管理してないよ、と言われていて、2行目は全く同名のファイルに見えますが、Subversion管理されているはずのファイルが見当たらないよ、と言われています。


これは、Windowssvn commitしたファイルをMacOSXsvn checkoutすると起こる現象です。見た目にはわかりませんけど、実は上のファイル名と下のファイル名は文字エンコーディング的に別のバイト列なんです。1番目のファイル名はMacOSXでしか表現できないファイル名であり、2番目はWindowsでしか表現できないファイル名です。


根本原因としては、Unicodeの分解可能文字を正規化する方式がNFCとNFDと2種類あって、これがMacOSXファイルシステムではNFD、WindowsではNFCと異なっているためです。(参考資料:MacWiki - UTF-8-MAC


この問題に対し、リポジトリ上でNFCに統一するようなSubversionのパッチが存在します。パッチ作者の方、ありがとうございます。これを簡単にインストールするのが本記事の趣旨です。

導入

ではインストールしていきます。MacPorts公式のsubversionパッケージを改造して、macports-utf8-macというパッケージを作ってみました。


手順としては、MacPortsのローカルリポジトリを作り、これをMacPortsが読むようにするだけです。今回の野良Portsgithub上に作ったので、もし無ければgitを用意してください。gitもMacPortsでインストールできます。(port install git-core)

$ cd /opt/local/var/
$ sudo git clone git://github.com/hnw/macports-repos-hnw.git
$ cd /opt/local/var/macports-repos-hnw/
$ sudo portindex
$ sudo vi /opt/local/etc/macports/sources.conf
(file:///opt/local/var/macports-repos-hnw を追加)

もしくは、このためにgitをインストールするなんて面倒だ、という場合は http://github.com/hnw/macports-repos-hnw/tree/master から「download」することもできます。


僕の趣味でroot権限で/opt/以下に展開しましたが、一人で使うマシンであれば、一般ユーザー権限でホームディレクトリ以下に展開してもいいと思います。念のため、正しく設定できていることを確認しましょう。

$ port search subversion-utf8-mac
subversion-utf8-mac            devel/subversion-utf8-mac 1.5.3        A version control system designed to be a better cvs.


ローカルリポジトリの準備ができたので、subversion-utf8-macパッケージをインストールします。公式版のsubversionとは共存できませんので、deactivateします。

$ sudo port deactivate subversion
$ sudo port install subversion-utf8-mac


これで/opt/local/bin/svnが生まれ変わっています!やったね!


何かgithub上で更新があった場合にはgit pullで更新に追随することも可能です。

注意点

上で説明した理屈からも明らかなことですが、過去に濁点付きのファイルをMacからcommitしていた場合には、本パッチを当てると逆に不整合が起こります。といっても、元々Windowsの人が困る状態でcommitしていたわけですから、この際Windowsの人に合わせてsvn mvしましょう。


ただし、mvするためには古いsvnコマンドと新しいsvnコマンドと両方が必要です。例えば下記のようになります。

sudo port deactivate subversion-utf8-mac
sudo port activate subversion
svn mv docs/濁点だよ.txt docs/dakuten.txt
svn ci -m 'ファイル名がNFDなファイルを退避'
sudo port deactivate subversion
sudo port activate subversion-utf8-mac
svn mv docs/dakuten.txt docs/濁点だよ.txt
svn ci -m 'ファイル名をNFCに変更してファイル名を復元'


2回commitする理由は用心のためですが、おそらく必要だと思います。面倒過ぎて泣けてきますね。でも私、負けない!


もちろん、全社的にMacOSXで統一している、なんて場合はこんな苦労は不要ですけどね。


もし何かトラブルが合っても何の責任も取れませんが、万一不都合があれば教えてください。

参考にしたページ