用語について
- ワーキングツリー …… リポジトリからチェックアウトされたファイルのツリー
- クリーン …… ワーキングツリーの内容が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 してくれるので、検出が可能です。
参考記事
- Chapter 11. GIT 用語集
- https://git-scm.com/docs/git-status
- https://git-scm.com/docs/git-diff
- https://git-scm.com/docs/git-describe
- git status -s でちょっと幸せになれる - Qiita
- Git での新規ファイル作成を含んだファイル変更有無の判定方法 - reboooot․net
-
Git その445 - ワーキングツリーがダーティーな時に出力結果にサフックスを追加して、コミットオブジェクトから到達できる最初の注釈付きのタグを表示する(git describe) - kledgeb ... こちらが使えるケースもありそうだと思いましたが、リポジトリに注釈付きタグがないと使えないという制限があるので、本文中では割愛しました。また、機械的に扱いたいときには
git diff --exit-code|--quietの方が便利でしょう。