コミットされていない変更があるかどうかをプログラムで判断するにはどうすればよいですか? 質問する

コミットされていない変更があるかどうかをプログラムで判断するにはどうすればよいですか? 質問する

Makefile で、コミットされていない変更 (作業ツリーまたはインデックスのいずれか) がある場合に特定のアクションを実行したいと思います。これを行う最もクリーンで効率的な方法は何ですか? 1 つのケースでは戻り値 0 で終了し、もう 1 つのケースでは戻り値 0 以外で終了するコマンドが目的に適うと思います。

git statusを実行して出力をパイプすることはできますgrepが、もっと良い方法があるはずだと感じています。

ベストアンサー1

アップデート:

  • トラスクtr言及されているコメントジョシュ・リー答え

    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 -lporcelainオプション
見るミリジウム答え

ノルナゴン言及コメント欄つまり、変更されたファイルがあってもその内容がインデックスと同じである場合は、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 addgit diff-indexgit 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
}

おすすめ記事