普通のpatchコマンドで取り込めるdiffファイルをgitで作成する
まとめ
$ git diff --no-prefix HEAD~ > thisis.patch $ patch --dry-run -p0 < thisis.patch $ patch -p0 < thisis.patch
git diffに--no-prefixをつける事で、普通のpatchで当てられるパッチファイルを出力できます。この例ではHEADの1個前*1からHEAD*2までのパッチです。
普通のpatchコマンドのほうの知識があまり無くて-p0がいまいちよく分からないんですが、git diff --no-prefixで作成したパッチファイルを当てるには必要みたいです。--dry-runは、実際には当てないけど当てた場合の結果を出力します。なので、まずは--dry-runで確認して、問題が無ければ実際にパッチを当てます。
解説
gitにはgit format-patchというコマンドがあります。流石分散バージョン管理といった所か、git format-patchはパッチを直ぐにメール出来るようにmbox形式でパッチを生成してくれる*3らしい。そのパッチは、git send-emailかgit imap-sendでメールできるようになっています。
ただ、普通のpatchコマンドでパッチを当てたい時には、mbox形式はむしろ困ったフォーマットです。一応、メールするのではなく*4パッチを当てるgit amというコマンドがあります。ただ、これが使えるのはgitで管理されてるプロジェクトだけ。
Subversionで管理してるプロジェクトに、gitで管理されてるプラグインを使うといったことがあり、プラグインの修正を取り込む必要が出てきました。本体はsvnなのでgit amは使えるはずも無く、なんとかpatchで当てられるdiffが必要でした。
-p0オプションについて
つまり、最初の "-p0" というオプションは「ディレクトリを無視しない」という意味になります。
パッチをあてる(その3:patchコマンドの-pオプションについて): 小粋空間
どうやらdiffの最初に記載されてるディレクトリパスの扱いのようです。なんとなくは分かったけど、まとめられるほど理解してないです。詳しくは上記サイトをどうぞ。
余談だけどGithubからパッチを得る方法
Githubに置いてるなら、URLにちょっと拡張子を追加するだけで、パッチファイルが保存できます。URLに.patchか.diffをつける事で、それぞれgit format-patchとgit diff相当で出力されます。
ただ、残念ながら.diffをつけても--no-prefixが無いgit diffなので、patchコマンド用にはなりません。
前述した追記の通り、patch -p1を使えば.diffを付けた方なら取り込めそうです。試してはないですけど。
例
このコミットのURLに拡張子をつけます。
それぞれこんな出力です。
例2
Compare viewのURLに対しても出来ます。
試してないけどGithubでコミットやブランチやタグ間のdiffを見る、Compare viewを使う - kanonjiの日記に書いたタグやブランチの比較にも出来るんじゃないかな。でも、あんまりコミット数が多いCompare viewでやると、重たそうですが。