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/bin
cp guilt /usr/local/bin
chmod 755 /usr/local/bin/guilt
mkdir /usr/local/lib/guilt
cp guilt-* /usr/local/lib/guilt
chmod 755 /usr/local/lib/guilt/guilt-*
cp os. /usr/local/lib/guilt
msysgit (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
とかしか使ってないけど)利用できています。
手元では、差し当って下記のみです。