ローカルの変更が存在するかどうかをスクリプトで確認するにはどうすればよいですか?おそらくと組み合わせてgit describe
?
4 に答える
git 1.6.6 以降、オプションgit-describe
を受け入れてい--dirty
ます。作業ツリーにコミットされていない変更がある場合、次のような出力が得られます。
$ git describe --dirty
1.0.2-2-g215081f-dirty
次の 2 つのプロパティの両方が満たされていることを確認する必要があります。
HEAD とインデックス キャッシュに違いがないこと
git diff-index --cached HEAD
インデックスと作業ツリーに違いがないこと:
git diff-files
両方のコマンドは、--quiet
違いがあるかどうかに応じて終了コードを設定するパラメーターを取ります (git 1.4 からしばらくしてから)。git 1.4 で動作させる必要がある場合は、コマンドを実行せずにコマンドを実行し、--quiet
出力が生成されるかどうかを確認する必要があります。
注: git diff
磁器コマンドであるため、スクリプトでは使用しないでください。代わりに上記の配管コマンドを使用してください。
私のgit_version.shスクリプトから取ったシェルコードの例:
git_dirty=yes
# git-1.4 does not understand "git-diff-files --quiet"
# git-1.4 does not understand "git-diff-index --cached --quiet HEAD"
if [ "x$($GIT diff-files)" = "x" ] && [ "x$($GIT diff-index --cached HEAD)" = "x" ]; then
git_dirty=no
fi
git バージョン >= 1.5 を要求できる場合は、if git diff-files --quiet && git diff-index --quiet --cached HEAD; then
上記の比較を置き換えることができます。
注:このソリューション (Antony の interactive とまったく同じ) は、HEAD に関連するローカルの変更git diff HEAD --quiet
のみを検出します。ただし、ローカル コミットもローカル変更と見なされる可能性があり、必然的に HEAD との差分には表示されません。SHA1 値を使用して、HEAD がローカルの変更ではないと見なす一連のコミットからのものかどうかを検出する必要があります。git describe
git diff --quiet
変更がある場合は終了ステータス 1 を返し、変更がない場合は 0 を返します。
ステージングされた変更と作業ディレクトリの間の差分が表示されることに注意してください。HEAD と作業ディレクトリの間の変更に関心がある場合は、git diff HEAD --quiet
.
--quiet
を意味し--exit-code
ます。
git status
ローカルの変更がない場合は、ゼロ以外のステータスで終了します。
しかし、「gitdescribeと組み合わせて」という意味がわかりません。