スクリプトでGit作業ディレクトリがきれいであることを確認する

スクリプトでGit作業ディレクトリがきれいであることを確認する

rsyncGitの作業ディレクトリをターゲットとして実行するスクリプトがあります。作業ディレクトリがクリーンである(コミットする変更はありません)ので、スクリプトは異なる動作をしたいと思います。たとえば、git status出力が次のような場合にスクリプトを終了したいとします。

git status
Already up-to-date.
# On branch master
nothing to commit (working directory clean)
Everything up-to-date

ディレクトリがきれいでない場合は、より多くのコマンドを実行したいと思います。

シェルスクリプトで上記のような出力をどのように確認できますか?

ベストアンサー1

構文解析された出力git statusは、機械が読むことができるのではなく、人間が読むことができるので悪い考えです。 Gitの将来のバージョンや異なる構成の環境では、出力が同じままであるという保証はありません。

UVVレビューgit status正しい方向に行っているが残念ながらコミットされていない変更がある場合、戻りコードは変更されません。しかしそれは提供します--porcelaingit 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作業ディレクトリがきれいでない場合、意味のある終了コードは提供されませんが、終了コードが提供されることgit diffも注目に値します。--exit-codeオプションは次のように動作します。違い1相違点が存在し、0相違点が見つからない場合に状態で終了するユーティリティです。

これにより、次の手順で段階的でない変更を確認できます。

git diff --exit-code

変更が適用されましたが、コミットされませんでした。

git diff --cached --exit-code

git diffサブモジュールのトレースされていないファイルは適切なパラメータで報告できますが、--ignore-submodules残念ながら、実際の作業ディレクトリに追跡されていないファイルを報告させる方法はないようです。作業ディレクトリにあるトレースされていないファイルが関連している場合は、git status --porcelainこれが最良の選択かもしれません。

おすすめ記事