Help us understand the problem. What is going on with this article?

gitコマンドでワーキングツリーがクリーンかどうか判定する

用語について

  • ワーキングツリー …… リポジトリからチェックアウトされたファイルのツリー
  • クリーン …… ワーキングツリーの内容がHEADが指すリビジョンと一致していることを表す
  • ダーティー …… ワーキングツリー内に、コミットされていない変更が含まれていることを表す

やり方

おそらく、可能なやり方はたくさん考えられると思いますが、ふつうはこれを使えばよさそうというやり方を紹介します。
また、シェルスクリプトなどで機械的に判定を行う上で便利なやり方を紹介します。

なお、動作確認時のgitのバージョンはv2.17.1です。

gitで追跡されていないファイルを含めて判定する

当然 git status でわかるわけですが、そのままでは機械的に扱うには少々不便です。
--short|-s オプションを使うと出力がよりシンプルな扱いやすい形になります。

$ git status -s
 D bar.txt
D  baz.txt
 M foo.txt
?? new.txt

上の出力結果で、 D は削除されたものを、 M は差分のあるファイルを、 ?? はuntrackedな(git管理外の)ファイルを表しています。
ワーキングツリーがクリーンなときには何も表示されないところが、コマンドで判定する上で嬉しいポイントです。

従って、シェルスクリプト上では例えば次のように判定できます:

判定例
if [ $(git status --short | wc -l) -ne 0 ]; then
  # dirty!
fi

他のやり方としては、 git add コマンドを -N|--intent-to-add オプションを付けて実行した上で、 git diff コマンドを使う、といったやり方もあるようです。
こちらについては、後掲のreboooot․netさんの記事をご覧ください。

gitで追跡されているファイルのみを対象とする

この場合、 git status だけでなく、 git diff コマンドでも判別できます。
機械的な正否判定には git diff --quiet が便利です。

判定例
if ! git diff --quiet; then
  # dirty!
fi

--quiet オプションを付けると一切の出力をせず、 --exit-code オプション同様に差分のあるときに exit 1 してくれるので、検出が可能です。

参考記事

progrhyme
Software Engineer. Was @key-amb
https://progrhy.me/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away