rsync
Gitの作業ディレクトリをターゲットとして実行するスクリプトがあります。作業ディレクトリがクリーンである(コミットする変更はありません)ので、スクリプトは異なる動作をしたいと思います。たとえば、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
正しい方向に行っているが残念ながらコミットされていない変更がある場合、戻りコードは変更されません。しかしそれは提供します--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
作業ディレクトリがきれいでない場合、意味のある終了コードは提供されませんが、終了コードが提供されることgit diff
も注目に値します。--exit-code
オプションは次のように動作します。違い1
相違点が存在し、0
相違点が見つからない場合に状態で終了するユーティリティです。
これにより、次の手順で段階的でない変更を確認できます。
git diff --exit-code
変更が適用されましたが、コミットされませんでした。
git diff --cached --exit-code
git diff
サブモジュールのトレースされていないファイルは適切なパラメータで報告できますが、--ignore-submodules
残念ながら、実際の作業ディレクトリに追跡されていないファイルを報告させる方法はないようです。作業ディレクトリにあるトレースされていないファイルが関連している場合は、git status --porcelain
これが最良の選択かもしれません。