219

目標は、シェルコマンドで評価できる明確なステータスを取得することです。

試しgit statusましたが、コミットする項目があっても常に0を返します。

git status
echo $?  #this is always 0

私には考えがありますが、それはかなり悪い考えだと思います。

if [ git status | grep -i -c "[a-z]"> 2 ];
then
 code for change...
else
  code for nothing change...
fi

その他の方法で?


次の解決策で更新します。MarkLongairの投稿を参照してください。

これを試しましたが、問題が発生します。

if [ -z $(git status --porcelain) ];
then
    echo "IT IS CLEAN"
else
    echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
    echo git status
fi

次のエラーが発生します[: ??: binary operator expected

今、私はその男を見て、gitdiffを試してみました。

===================私の希望のためのコード、そしてより良い答えを願っています======================

#if [ `git status | grep -i -c "$"` -lt 3 ];
# change to below code,although the above code is simple, but I think it is not strict logical
if [ `git diff --cached --exit-code HEAD^ > /dev/null && (git ls-files --other --exclude-standard --directory | grep -c -v '/$')` ];
then
        echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
    exit 1

else
    exit 0
fi
4

10 に答える 10

281

の出力が空であるかどうかをテストする代わりに、git status --porcelain気になる各条件を個別にテストすることもできます。たとえば、の出力に追跡されていないファイルがあるかどうかは、常に気になるとは限りませんgit status

たとえば、ステージングされていないローカルの変更があるかどうかを確認するには、次の戻りコードを確認します。

git diff --exit-code

ステージングされているがコミットされていない変更があるかどうかを確認するには、次の戻りコードを使用できます。

git diff --cached --exit-code

最後に、作業ツリーに無視されない追跡されていないファイルがあるかどうかを知りたい場合は、次のコマンドの出力が空であるかどうかをテストできます。

git ls-files --other --exclude-standard --directory

更新: 出力からディレクトリを除外するようにそのコマンドを変更できるかどうかを以下で尋ねます。を追加することで空のディレクトリを除外できますが--no-empty-directory、その出力内のすべてのディレクトリを除外するには、次のように出力をフィルタリングする必要があると思います。

git ls-files --other --exclude-standard --directory | egrep -v '/$'

-vtoegrepは、パターンに一致しない行のみを出力することを意味し、パターンは、で終わるすべての行に一致します/

于 2011-02-28T08:31:14.540 に答える
148

の戻り値は、コミットする変更があるかどうかではなくgit status、 の終了コードを示すだけです。git status

git status出力のよりコンピューターで読み取り可能なバージョンが必要な場合は、試してください

git status --porcelain

詳細については、 の説明を参照してくださいgit status

使用例 (スクリプトは出力が得られるかどうかをテストするだけgit status --porcelainで、解析は必要ありません):

if [ -n "$(git status --porcelain)" ]; then
  echo "there are changes";
else
  echo "no changes";
fi

テストする文字列、つまり の出力を引用符で囲む必要があることに注意してくださいgit status --porcelain。テスト コンストラクトに関するその他のヒントについては、Advanced Bash Scripting Guide (セクション文字列の比較) を参照してください。

于 2011-02-28T07:43:28.963 に答える
41

あなたが私のような人なら、次のようなものがあるかどうか知りたいでしょう:

1) 既存のファイルへの変更 2) 新しく追加されたファイル 3) 削除されたファイル

具体的には、4) 追跡されていないファイルについて知りたくありません。

これはそれを行う必要があります:

git status --untracked-files=no --porcelain

レポがクリーンな場合にスクリプトを終了する bash コードを次に示します。追跡されていないファイル オプションの短いバージョンを使用します。

[[ -z $(git status -uno --porcelain) ]] && echo "this branch is clean, no need to push..." && kill -SIGINT $$;
于 2013-02-06T23:42:52.230 に答える
9

git status --porcelainシンプルなgrepテストと組み合わせることも可能です。

if git status --porcelain | grep .; then
    echo Repo is dirty
else
    echo Repo is clean
fi

私は時々これを単純なワンライナーとして使用します:

# pull from origin if our repo is clean
git status --porcelain | grep . || git pull origin master

-qsgrep コマンドに追加してサイレントにします。

于 2013-10-10T19:23:43.000 に答える
9

私はこれについてテストを行います:

git diff --quiet --cached

またはこれを明示する:

git diff --quiet --exit-code --cached

どこ:

-- 終了コード

diff(1) のようなコードでプログラムを終了させます。つまり、違いがあれば 1 で終了し、0 は違いがないことを意味します。

- 静かな

プログラムのすべての出力を無効にします。--exit-code を意味します

于 2016-11-01T14:39:16.587 に答える
5

gitソースコードから、以下を含むshスクリプトがあります。

require_clean_work_tree () {
    git rev-parse --verify HEAD >/dev/null || exit 1
    git update-index -q --ignore-submodules --refresh
    err=0

    if ! git diff-files --quiet --ignore-submodules
    then
        echo >&2 "Cannot $1: You have unstaged changes."
        err=1
    fi

    if ! git diff-index --cached --quiet --ignore-submodules HEAD --
    then
        if [ $err = 0 ]
        then
            echo >&2 "Cannot $1: Your index contains uncommitted changes."
        else
            echo >&2 "Additionally, your index contains uncommitted changes."
        fi
        err=1
    fi

    if [ $err = 1 ]
    then
        test -n "$2" && echo >&2 "$2"
        exit 1
    fi
}

このスニプレットは、使用方法と、既知のファイルに変更があるかどうかを確認する方法を示してgit diff-filesgit diff-indexます。ただし、新しい不明なファイルが作業ツリーに追加されているかどうかを確認することはできません。

于 2011-03-01T08:11:00.233 に答える
0

きれいではありませんが、機能します:

git status | grep -qF 'working directory clean' || echo "DIRTY"

メッセージがロケールに依存しているかどうかわからないのでLANG=C、前に置いてください。

于 2011-02-28T11:44:52.630 に答える