2017-11-23 14 views
0

gitリポジトリに変更があるかどうかチェックしたいと思います。リポジトリに変更があるかどうかを確認する最速の方法は?

私は

if command git status --porcelain 2> /dev/null | grep -q .; then 
    X 
else 
    Y 
fi 

この条件を使用してきたが、それはあまりにも遅いです。

もっと速い方法がありますか?これを行うには、gitコマンドを使用する必要がありますか、そのコマンドを完全にバイパスする超高速メソッドがありますか?

+1

:ここでは短いバージョンは、(見ていないが、変更を上演)であります>/dev/null |読み取り-n1;エコー "Repo has changes"; fi'。私たちがサブシェルと外部コマンドを取り除くので、現在のテストよりも速くなるでしょう。 –

+0

@gniourf_gniourfなぜあなたは 'tail'から' read'に切り替えましたか? – theonlygusti

+0

'tail'は外部コマンドで、' read'は組み込みコマンドです。さらに、 'read -n1'では、最大で1文字だけを読み込みます(ストリーム全体ではありません)。 'grep -q。 'でも同じことができますが、' grep'は外部コマンドなので 'read'よりも遅くなります。 –

答えて

0

私は--shortというオプションをこの種のものに適しています。何も変更されていない場合は、空の文字列を返します。

test -n "$(git status --short)" && echo 'changes detected' || echo 'no change' 

スピードの改善があるかどうかわかりません。

+0

私はスピードだけを気にします。確かにこれはコメントでしたか? – theonlygusti

+0

回答の書式がきれいです。あなたのベンチはこの方法でマークされていますか? –

0

(編集:GNUismを取り除く、あります合理的なPOSIX専用テスト)いずれかを費やすことなく、インデックスとworktreeで異なる内容でHEADとインデックス内の異なるコンテンツを持つパス、パスが表示されます

if (git diff-index --cached @; git diff-files) | grep -q .; then 
     tracked changes in index or worktree 
else 
     index and tracked worktree content identical to checkout 
fi 

その違いが何であるかを理解する時間。

応答時間から最後の1ミリ秒ごとにシェービングしたい場合は、stdbuf -oL gitを使ってgitラインバッファの出力を作ることができるので、最初のdiffはすぐにsedを押してパイプをシャットダウンします。さもなければ、それらを印刷する前に数十個の検出された差分をバッファリングするかもしれません。

+0

'stdbuf -oL git'をどのように動かすのですか? – theonlygusti

+0

re stdbuf、 'stdbuf -oL git'を' git'の代わりに使ってください。常に虚偽の部分については、私はそれを試してみて、変更を加え、偽を示し、リセットします。おそらくタイプミス? – jthill

1

Git自身のソースコードは、良い解決策のヒントを与えることができます。require_clean_work_treeシェル機能は本質的にあなたが望むものです。 `ifコマンドのgitのステータス--porcelain 2:あなたはgitのステータス`かどうか--porcelain 2>は/ dev/null`なので出力何かを知りたい場合は

git_has_changes() { 
    git update-index -q --ignore-submodules --refresh 
    git diff-files --quiet --ignore-submodules 
} 

if git_has_changes; then 
    echo "has changes" 
else 
    echo "no change" 
fi 
関連する問題