昨年後半ぐらいから、じわじわとsubversionから Git へと乗り換えつつあります。早いし、リポジトリにアクセス出来ないような状態でも、ドンドンcommit出来るのが最高です。

一方、Mac で OmniOutliner を非常によく使ってるんですが、こいつは、パッケージ形式(フォルダが一つのファイルのように見える)である上に、本体のアウトラインが圧縮されたXMLになっているのです。こいつをSCMで管理しようと思うと、diffが取れなくて困るわけです。

それで、最近、Gitのメンテナの濱野さんの入門Gitを読んだのですが、

入門Git

そこに書いてある、特定のファイルに対して、テキスト変換してからdiffする方法を用いる方法を使えば、差分を見られるなと気づきました。

具体的には、.git/configにdiff時のテキスト変換ルールを書き、.gitattribute で、そのテキスト変換ルールを使うように設定することになります。uncompress して pretty print してある状態で比較してくれれば、XMLとはいえ、ずいぶんマシです。XML pretty printer にはxmlppを使いました。

まず、xmlpp を適当な場所にインストールし、さらに、oo3xml2txt というシェルスクリプトを用意します。

#!/bin/sh
gzcat "$1" | xmlpp

つづいて、.git/config に、oo3xml という diffルールを設定します。

[diff "oo3xml"]
        textconv = oo3xml2txt

最後に、.gitattributesファイルに、以下のようなルールを書きます。

*.oo3/contents.xml diff=oo3xml

OmniOutliner のパッケージは、中にcontents.xmlというファイル名で、XMLで表現されたアウトラインがgzip圧縮されて入っています。

これで、git diff で差分が取り出せます。ベストソリューションではないですが、結構使えるので、僕としては非常に満足しています。

xmlpp 、かなり秀逸だと思います。MacOS X だと、なんかのコマンドで代用出来たようにも思うのですが(知ってる人いたら教えてください)、ともあれ、つかえるので素晴らしい。

追記 (2010/4/7)

rok さんにコメント頂いたので、いくつか追記。

xmlpp の代わりに、デフォルトで入っている xmllint を使えます。この場合は、oo3xml2txt を以下のようにする。これで同じ効果が得られます。

#!/bin/sh
gzcat "$1" | xmllint --format --xmlout -

contents.xml は圧縮がデフォルトなんですが、設定で変えられるものの、pretty printした状態でdiffとらないと読める状態ではないので、まぁ、デフォルト圧縮したままでってのが良いのではないでしょうか。

追記 (2010/4/10)

otsuneさんに、quote したほうがいいんじゃない?というコメント頂いたので、そのように。確かに空白もあります。


Archived comments:

shigeya 02 Apr 2010

コメントのテスト

rok 03 Apr 2010

実は XML 全然分からないのですが、

xmllint --format

とかで適当にフォーマットしてくれるみたいです。

あと、OminiOutliner は書類の詳細設定で「圧縮保存」のチェックを外しておけば、contents.xml は圧縮されません。

shigeya 07 Apr 2010

ちょっと追記してみました。。

otsune 09 Apr 2010

Mac OS Xのファイルを扱うんであれば
gzcat "$1"
のほうがいいのかも?

shigeya 10 Apr 2010

なんと、otsuneさんがコメントを。

たしかに、Quote した方が良いですね。僕はあんまり空白ファイル名に入れない人なんで困ってなかった。。。

ありがとうございます。追記しました。

blog comments powered by Disqus