Skip to content

Instantly share code, notes, and snippets.

@sgur
Last active August 29, 2015 14:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sgur/8889fa010926af36de7f to your computer and use it in GitHub Desktop.
Save sgur/8889fa010926af36de7f to your computer and use it in GitHub Desktop.

title: msysgit で guilt を利用する

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 から利用する場合、パスを設定したり等さらにややこしい筈です。

guilt を clone する

http://repo.or.cz/w/guilt.git から リポジトリを clone します。

cd ~/Work
git clone http://repo.or.cz/w/guilt.git

インストールする

ファイルのコピー

makeinstall がある場合 (≒ MSYS 、 MINGW インストール済)

Git Bash を管理者権限で起動して、リポジトリのディレクトリで make install します。

makeinstall が未インストールな場合

  1. Git Bash を管理者権限で起動
  2. リポジトリのフォルダで cd
  3. mkdir /usr/local/bin
  4. cp guilt /usr/local/bin
  5. chmod 755 /usr/local/bin/guilt
  6. mkdir /usr/local/lib/guilt
  7. cp guilt-* /usr/local/lib/guilt
  8. chmod 755 /usr/local/lib/guilt/guilt-*
  9. 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 は利用可能なのですが、サブコマンドを指定せずに単体で guilt を実行した場合や、 サブコマンドが見つからなかった場合に、msysgit のシェル/コマンドの機能不足のため、エラーが表示されてしまいます。

  • find の -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ベースへ引越し

guilt init

guilt はgitのブランチ毎にパッチセットを管理できるようで、masterブランチでguilt initした場合は.git/patches/masterにパッチ用のディレクトリが作らます。

ので、必要に応じてブランチを変更しておきます。

cd /path/to/git_repo
git checkout -b test
guilt init

これで .git/patches/test ができているはず。

mqからの移行

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 ファイルのフォーマットに互換性はないので、ファイルが空の時を除いてコピーしてきてはいけません。

mqと共有する

よく考えたら、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とかしか使ってないけど)利用できています。

手元では、差し当って下記のみです。

  • guilt help が動かない (Documentationディレクトリでmake installすればよさげ / msysgit にはそもそも man がない)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment