Makefile で、コミットされていない変更 (作業ツリーまたはインデックスのいずれか) がある場合に特定のアクションを実行したいと思います。これを行う最もクリーンで効率的な方法は何ですか? 1 つのケースでは戻り値 0 で終了し、もう 1 つのケースでは戻り値 0 以外で終了するコマンドが目的に適うと思います。
git status
を実行して出力をパイプすることはできますgrep
が、もっと良い方法があるはずだと感じています。
ベストアンサー1
アップデート:
-
porcelain を使用する他の方法では、bash を使用していることを前提としており、クロスシェルまたはクロスプラットフォームの互換性がありません。
次の方法はどこでも機能します。git add . && git diff --quiet && git diff --cached --quiet
必要なすべてのケースをキャッチしているようです(追跡されていないファイルや、
git add .
ステージングされないステージングされていない変更を含むgitサブモジュールを含む) OPのダニエル・シュトゥッツバッハ指摘しているコメント欄この単純なコマンド
git diff-index
彼のために働いた:git update-index --refresh git diff-index --quiet HEAD --
より正確な方法はgit status --porcelain=v1 2>/dev/null | wc -l
、porcelain
オプション。
見るミリジウムの答え。
(ノルナゴン言及コメント欄つまり、変更されたファイルがあってもその内容がインデックスと同じである場合は、git update-index --refresh
の前にを実行する必要がありますgit diff-index
。そうしないと、diff-index
ツリーがダーティであると誤って報告されます)
すると、「コマンドが成功したかどうかを確認するにはどうすればよいですか?" bash スクリプトで使用する場合:
git diff-index --quiet HEAD -- || echo "untracked"; // do something about it
注:コメントしたによるアンソニー・ソティル
git diff-index HEAD ...
コミットのないブランチ(新しく初期化されたリポジトリなど)では失敗します。
私が見つけた回避策の1つはgit diff-index $(git write-tree) ...
そしてharidsv
指摘しているコメント欄新しいgit diff-files
ファイルでは、 はdiff として検出されません。より安全な方法は、まずファイル仕様で を実行し、次に を使用して、実行前にインデックスに何かが追加されたかどうかを確認することです。git add
git diff-index
git commit
git add ${file_args} && \ git diff-index --cached --quiet HEAD || git commit -m '${commit_msg}'
そして6502コメント欄には次のように報告されています:
私が遭遇した問題の 1 つは、
git diff-index
ファイルのタイムスタンプ以外に違いがないのに、違いがあると表示されることです。1回
実行するとgit diff
問題は解決します (驚くべきことに、git diff
サンドボックスの内容が実際に変更されます。つまり、ここです.git/index
)。
これらのタイムスタンプの問題は、gitがDockerで実行。
元の回答:
「プログラム的に」とは、決して頼りにしないという意味です磁器のコマンド常に頼りになる
配管コマンド。
「Git でダーティインデックスや追跡されていないファイルを確認する代替案については「git status --porcelain
」
インスピレーションを得ることができます私たちが話している新しい「require_clean_work_tree
機能」から;) (2010 年 10 月初旬)
require_clean_work_tree () {
# Update the index
git update-index -q --ignore-submodules --refresh
err=0
# Disallow unstaged changes in the working tree
if ! git diff-files --quiet --ignore-submodules --
then
echo >&2 "cannot $1: you have unstaged changes."
git diff-files --name-status -r --ignore-submodules -- >&2
err=1
fi
# Disallow uncommitted changes in the index
if ! git diff-index --cached --quiet HEAD --ignore-submodules --
then
echo >&2 "cannot $1: your index contains uncommitted changes."
git diff-index --cached --name-status -r --ignore-submodules HEAD -- >&2
err=1
fi
if [ $err = 1 ]
then
echo >&2 "Please commit or stash them."
exit 1
fi
}