git status
出力は機械可読ではなく人間可読であることを目的としているため、の出力の解析は悪い考えです。Gitの将来のバージョンまたは異なる構成の環境で出力が同じままであるという保証はありません。
UVVのコメントは正しい軌道に乗っていますが、残念ながら、git status
コミットされていない変更があった場合の戻りコードは変わりません。ただし、スクリプトの解析しやすい形式で--porcelain
出力をgit status --porcelain
フォーマットするオプションを提供し、Gitバージョン間およびユーザー構成に関係なく安定したままになります。
の空の出力をgit status --porcelain
、コミットする変更がないことを示すインジケータとして使用できます。
if [ -z "$(git status --porcelain)" ]; then
# Working directory clean
else
# Uncommitted changes
fi
作業ディレクトリ内の追跡されていないファイルを気にしない場合は、--untracked-files=no
オプションを使用してそれらを無視できます。
if [ -z "$(git status --untracked-files=no --porcelain)" ]; then
# Working directory clean excluding untracked files
else
# Uncommitted changes in tracked files
fi
条件に対して、これはより堅牢にするために、実際に原因git status
を出力せずに失敗してstdout
、我々はにチェックを絞り込むことができます。
if output=$(git status --porcelain) && [ -z "$output" ]; then
# Working directory clean
else
# Uncommitted changes
fi
またgit status
、作業ディレクトリが汚れている場合は意味のある終了コードを提供しませんが、diffユーティリティと同様に動作するオプションをgit diff
提供し--exit-code
ます。つまり、違いがあり、何も見つからなかったときにステータスで終了します。1
0
これを使用して、次の方法でステージングされていない変更を確認できます。
git diff --exit-code
ステージングされたが、コミットされていない変更:
git diff --cached --exit-code
けれどもgit diff
への適切な引数を経由してサブモジュールに人跡未踏のファイルに報告することができ--ignore-submodules
、残念ながら実際の作業ディレクトリに人跡未踏のファイルを報告していする方法がないと思われます。作業ディレクトリ内の追跡されていないファイルが関連している場合git status --porcelain
は、おそらく最善の方法です。