git apply を dry run する方法

Git の git apply コマンドを、実際にファイルを変更することなく事前にチェックしたいことがあります。 そういうときに取りうるオプションとしてどんなものがあるかをまとめました。 尚、今回の動作確認には Git のバージョン 2.17.0 を使用しました。

  • a) パッチが問題なく適用できるかどうかを知りたい
  • b) パッチの概要を知りたい

a) パッチが問題なく適用できるかどうかを知りたい

git apply を実際に実行したときにパッチが問題なく適用できるかどうかを知りたい場合は、 --check オプションが便利です。 --check オプションを使用すると、実際にファイルに変更を加えることなく、パッチを問題なく適用することができるのかどうかをチェックできます。

問題がない場合:

$ git apply --check sample.patch

問題がある場合:

$ git apply sample.patch
error: patch failed: app/articles/templates/articles/teaser.html:10
error: app/articles/templates/articles/teaser.html: patch does not apply

問題がない場合は、終了ステータスが 0 で、標準出力に何も出力されません。 逆に問題がある場合は、終了ステータスが 1 で、標準エラーに上のようなエラーメッセージが出力されます。

b) パッチの概要を知りたい

対象のパッチの概要を知りたい場合は次の 3 つのオプションが便利です。

  • --summary
  • --stat
  • --numstat

--summary

--summary オプションを使うと、ファイルの追加・移動・削除やファイルパーミッション( mode )の変更等の大きな変更のみをチェックすることができます。 --check と同じくファイルには変更を加えません。

取り上げるべき変更がない場合:

$ git apply --summary sample2.patch

取り上げるべき変更がある場合:

$ git apply --summary sample2.patch
create mode 100644 install.php
mode change 100644 => 100755 index.php

--stat

--stat オプションを使うと、ファイルに変更を加えることなく、パッチの統計情報のみ確認することができます。

$ git apply --stat node-232327-93.patch
 modules/node/content_types.inc |    8 +++++---
 modules/node/node.test         |   36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+), 3 deletions(-)

変更の加えられる各ファイルに対して、行の追加・削除がどれだけあるのかを人間が見て読みやすい形式で表示してくれます。

--numstat

--numstat オプションを使うと、ファイルに変更を加えることなく、パッチの統計情報のみ確認することができます。

$ git apply --numstat node-232327-93.patch
5   3   modules/node/content_types.inc
36  0   modules/node/node.test

--numstat--stat と同様のふるまいをしますが、出力を他のプログラムで処理することを想定していて machine friendly な点が --stat とは異なります。 --numstat はポイントだけを一切装飾を加えずに出力します。 また、 --stat は読みやすさのために対象ファイル名を省略したりしますが、 --numstat はそのようなことも行いまえsん。

--numstat を使う場合は、追加で -z オプションを指定することができます。 -z を指定しないとファイル名の特殊文字が munge されますが、 -z を指定した場合は特殊文字もそのまま出力されます。 ただし -z オプションを指定した場合は行区切りが NULL 文字になるようです。

ファイル名に日本語が含まれる場合等は -z オプションを使うと便利かもしれません。

以上です。