2014年5月10日土曜日

Gitでsubtree mergeによるライブラリ管理

※ これから新規に外部ライブラリの管理をする場合は、 Git のバージョンが1.7.11以降である必要がありますが、 Git subtree のほうがお勧めです。

背景


Git では外部ライブラリ(これまた Git で管理されている)を取り込む仕組みとして、 submodule が用意されています。たんなるソースのスナップショットをコピーして置いておくのに比べると、外部ライブラリのバージョンアップに追随できるという利点があります。しかし、 submodule は運用上の問題をいくつか抱えています。

1. git clone した直後に git submodule update をしなくてはならない
 リポジトリをクローンしてすぐにコードをいじり始めたくても、余計なひと手間が必要になります。
 GUI クライアントの中には、この作業を忘れないように通知してくれるものもあります。

2. 外部ライブラリの URL が固定化してしまう
 .gitmodules には submodule の URL が埋め込まれており、ライブラリ側の URL の変更があると追随できなくなります。(正確には、追随するために一つコミットが必要になります。) Web に公開されているオープンソースライブラリの多くは URL を頻繁に変えたりはしませんが、内作のライブラリでは構成変更での取回しの悪さは意外と煩わしいものです。

3. とにかく、なんか仕組みがややこしい
 submodule の目的は外部ライブラリの更新をトレースすることであって、プロジェクト本体のソースをいじる人の多くにとっては関心のないものです。このためにユーザー全員に新しい仕組みの使い方を意識してもらうのはオーバーヘッドが大きすぎる気がします。


ちなみに、 Subversion にも svn:externals プロパティという仕組みがありましたが、 Git submoduleと同じような問題があり、使うのがためらわれました。

他の分散型 VCS もいろいろ探索しましたが、結局のところ、 Git の subtree merge ほど素直にやりたいことができる仕組みはありませんでした。


2014年5月2日金曜日

Git for Windowsにてgit diffで日本語が文字化けしないようにする方法のメモ

背景


ソースのコメントは普段は英語でしか書かないし、日本語で書くときはgitkで差分を見ているのでそれほど気にしていなかったのですが、どうしてもコマンドラインで完結させたいという人がいたので方法を探してみました。

まず前提として、UTF-8で書かれた日本語は基本的に化けません。
2011年ごろまでのGit for Windowsは、ファイル名に日本語を使うとひどいことになりましたが、今はファイル名も含めてすべてUTF-8になっていると思います。

ここでの問題は、Shift_JISやJIS(ISO-2022-JP)やEUCな内容のファイルです。昔からメンテナンスしているコードやHTMLには残っている場合があるでしょう。本当に残しておく必要がなければgit filter-branchで全履歴の文字コードをUTF-8へ変換してしまう手がお勧めですが、それはまた別の話。

対策

Shift_JIS用

git config --global alias.dis '! f() { git diff $@ | iconv -f shift_jis;};f'

というコマンドを一度打っておき、"git dis"と打つとSJISが化けない版のdiffが出る。
"git diff"は引き続き化け続ける。

JIS(ISO-2022-JP)用

git config --global alias.dij '! f() { git diff $@ | iconv -f ISO-2022-JP;};f'

EUC-JP用

git config --global alias.die '! f() { git diff $@ | iconv -f EUCJP;};f'

なお、iconv.exeがパスの通る場所に必要です。Git for Windows (MSYSGit) 1.8.4には同梱されていたような気がしますが、私の環境にはどこかから持ってきたやつが生きているだけかもしれません。コマンドを適切に書き換えてやればnkfでもOKのようです。

ただし、diffへの色付け(追加行が緑、削除行が赤など)は失われてしまいます。


所感


一応上記の対策で一定の効果は見られますが、文字コード関連の問題は、やりたいことの本質に関係ないわりに時間を取られるという点で、昔からちっとも進歩した気がしません。すべてがUTF-8になれば幸せになれるかもしれませんが、それにはまだまだ時間がかかりそうです。