「git + maven-release-plugin + ( on windows )」の設定
backlog-template-issueの管理リポジトリを、Githubに変更しました - @ikikko のはてなダイアリーの裏話。そもそも何で移行したかというと、
- Githubのサイトデザインがかっこいい
という単純な理由。いや、分散バージョン管理システムを使いこなせると便利ですよね、ほんと。
けど、実際にやってみると、意外にはまったのですよね。特にgitとWindowsの相性という点と、(自動でリポジトリにタグ付けしたりする)maven-release-plugin絡みで。というわけで、自分の備忘録兼誰かの後学のために。
移行方法
リポジトリの移行
今まではSourceForge.JPに置いていたのですが、git-svnを使うとあっさり移行できました。
・・・
すいません、メモを取っていないので、どうやったかは覚えていません>< 多分、Ogawa::Buzz: Google CodeのリポジトリをGitHubに移行するときにやったことと同じ感じ。
トラブルシューティング
ここからは、主に詰まった事象と、その対策について。ただ、皆が皆この対策が必要ということではありません。自分の環境がおかしいがために必要になった可能性も多々あります*1。まぁ、とりあえずこんな感じで対応できたよと備忘録程度に。
Githubへpush時に、プロンプトが固まって先に進まない
コンソール出力は、こんな感じ。
... [INFO] Checking in modified POMs... [INFO] Executing: cmd.exe /X /C "git add pom.xml" [INFO] Working directory: c:\workspace\backlog-template-issue [INFO] Executing: cmd.exe /X /C "git status" [INFO] Working directory: c:\workspace\backlog-template-issue [INFO] Executing: cmd.exe /X /C "git commit --verbose -F C:\Users\ikikko\AppData\Local\Temp\maven-scm-1361663072.commit pom.xml" [INFO] Working directory: c:\workspace\backlog-template-issue [INFO] Executing: cmd.exe /X /C "git push" [INFO] Working directory: c:\workspace\backlog-template-issue
これはまぁ、原因はすぐに分かりました。最後から2行目「Executing: cmd.exe /X /C "git push"」とあるように、maven-release-pluginでは別にプロセスを立ち上げてリリース関連処理を実行します。この先で公開鍵認証のパスフレーズを聞かれているのですが、別プロセスに入力ができないので、いつまでもこのままの状態となります。
対策は、ssh-agentを使って一度入力したパスフレーズをキャッシュして再度問い合わせされないようにしました。具体的には、以下の2ファイル(agent.bat*2, mvn-release.bat)を作って、それぞれ実行。もちろん、それぞれのコマンドへのパスも確認しておくこと*3。
- agent.bat
ssh-agent cmd
- "ssh-agent"でキャッシュを立ち上げる
- mvn-release.bat
ssh-add ~/.ssh/id_rsa mvn clean release:prepare release:perform
- "ssh-add"で秘密鍵を登録する
- maven-release-pluginを実行する。
branch切り替えで失敗する
↑のpushを無事くぐり抜けても、次はrelease:performを行う前のgit checkout "作成されたタグ名"で以下のようなエラーが起きました。
error: You have local changes to 'pom.xml' ; cannot switch branches.
このエラーは、コミットされていないファイルがある状態でブランチを切り替えようとしたときに起きます。これまたなんでだろうと思って、maven-release-pluginが使用するtarget/checkout以下のディレクトリをDiff取ってみると、ちょっと怪しい箇所が。ほとんどのファイルが軒並み更新されたとなっているのですが、もちろん何も更新されていません。で、よく見ると(↑のagent.batのように)1行からなるファイルには更新済みマークが入っていない。あー、改行コードの扱いかなと思って、その辺見てみました。
ビンゴ!autocrlfが、グローバル設定ではtrueになっていたのに、リポジトリごとの設定ではautocrlfがfalseになってました。元々はSVN管理からgit-svnで持ってきたのですが、おそらくこのタイミングでautocrlfの設定が変わったのでしょう。falseにしても特に問題なさそうなので、グローバルの設定をfalseに修正。
autocrlf = false