Vimのリポジトリも code.google.com での mercurial ベースの運用から、github へリポジトリを移してきていて、 そろそろ hg + mq によるパッチ管理から、git + guilt へ移行してこなきゃな、という事で、guiltを導入してみます。
Linux であれば大した問題でもないので、今回は Windows で msysgit を使う場合です。
stable の Ver.1.9.5 では確認していません。 Fifth release candidate of Git for Windowsを利用しています。
以下は Git Bash から利用する場合です。 コマンドプロンプトとか PowerShell から利用する場合、パスを設定したり等さらにややこしい筈です。
http://repo.or.cz/w/guilt.git から リポジトリを clone します。
cd ~/Work
git clone http://repo.or.cz/w/guilt.git
make と install がある場合 (≒ MSYS 、 MINGW インストール済)Git Bash を管理者権限で起動して、リポジトリのディレクトリで make install します。
make と install が未インストールな場合mkdir /usr/local/bincp guilt /usr/local/binchmod 755 /usr/local/bin/guiltmkdir /usr/local/lib/guiltcp guilt-* /usr/local/lib/guiltchmod 755 /usr/local/lib/guilt/guilt-*cp os. /usr/local/lib/guiltmsysgit (MSYS) 環境は元々サポート外です。
サポートしているかどうかは、/usr/local/lib/guit/os.(システム名) というファイルが存在しているかです。
システム名は uname -s の結果で判別していますので
cp /usr/local/lib/guilt/os.{Linux, `uname -s`}
もしくは
ln -s /usr/local/lib/guilt/os.{Linux,`uname -s`}
(Windows の NTFS でシンボリックリンクを貼りたい場合は管理者権限が必要なので注意)
として、動作するよう変更します。 (/usr/local/bin/guiltの該当する箇所をLinuxに置き換えても可)
このままで一応 guilt は利用可能なのですが、サブコマンドを指定せずに単体で guilt を実行した場合や、
サブコマンドが見つからなかった場合に、msysgit のシェル/コマンドの機能不足のため、エラーが表示されてしまいます。
-perm +111 は未サポートcolumn コマンドが msysgit には用意されていないそこで、以下のように修正して、動作するようにしてやります。
guilt の時にサブコマンドが縦に並んでしまいますが、そこは目を瞑りましょう。
@@ -73,8 +73,8 @@
guilt_commands()
{
- find "$GUILT_PATH/../lib/guilt" -maxdepth 1 -name "guilt-*" -type f -perm +111 2> /dev/null | sed -e "s/.*\\/$GUILT-//"
- find "$GUILT_PATH" -maxdepth 1 -name "guilt-*" -type f -perm +111 | sed -e "s/.*\\/$GUILT-//"
+ find "$GUILT_PATH/../lib/guilt" -maxdepth 1 -name "guilt-*" -type f 2> /dev/null | sed -e "s/.*\\/$GUILT-//"
+ find "$GUILT_PATH" -maxdepth 1 -name "guilt-*" -type f | sed -e "s/.*\\/$GUILT-//"
}
# by default, we shouldn't fail
@@ -122,7 +122,7 @@
disp "Guilt v$GUILT_VERSION"
disp ""
disp "Pick a command:"
- guilt_commands | sort | column | column -t | sed -e 's/^/ /'
+ guilt_commands | sort | sed -e 's/^/ /'
disp ""
disp "Example:"
guilt はgitのブランチ毎にパッチセットを管理できるようで、masterブランチでguilt initした場合は.git/patches/masterにパッチ用のディレクトリが作らます。
ので、必要に応じてブランチを変更しておきます。
cd /path/to/git_repo
git checkout -b test
guilt init
これで .git/patches/test ができているはず。
mq で利用していたパッチセットをコピーしてきます
cp /path/to/hg_repo/.hg/patches/{*.diff,*.patch} /path/to/git_repo/.git/patches/test
series ファイルも (#-/#+ によるパッチ適用/非適用のスイッチまで)互換性があるのでそのまま使えます。
cp /path/to/hg_repo/.hg/patches/series /path/to/git_repo/.git/patches/test
mq と guilt で status ファイルのフォーマットに互換性はないので、ファイルが空の時を除いてコピーしてきてはいけません。
よく考えたら、status 以外は互換性があるので mq のリポジトリを clone/checkout すればよいな…
mkdir .git/patches
hg clone https://bitbucket.org/path/to/mq .git/patches/test
guilt は空の status ファイルがないとエラーになるので、これだけは追加してやらないといけないようです。
touch .git/patches/test/status
調査中。今のところ(guilt push -aとかguilt pop -aとかしか使ってないけど)利用できています。
手元では、差し当って下記のみです。