エラーなしでgitcommitを実行する方法は?


92

git commit;を実行するファブリックスクリプトを作成しようとしています。ただし、コミットするものがない場合、gitはステータスが1。で終了します。デプロイスクリプトはそれを失敗と見なし、終了します。実際のコミットの失敗を検出したいので、git commit失敗をファブリックに完全に無視させることはできません。空のコミットの失敗を無視してデプロイを続行できるようにするにはどうすればよいですか?それでも実際のコミットが失敗したときに発生したエラーをキャッチできますか?

def commit():
    local("git add -p && git commit")

回答:


157

git diffの終了コードをチェックして、この状態を事前にキャッチしますか?

例(シェル内):

git add -A
git diff-index --quiet HEAD || git commit -m 'bla'

編集:git diffホルガーのコメントによるとコマンドを修正しました。


64
これgit diffは「磁器」コマンドであり、スクリプトには使用しないでください。あなたがおそらく欲しいのはgit diff-index --quiet HEAD || git commit -m 'bla'です。この回答も参照してください。
ホルガー

1
さらに説明すると、問題git diff --quiet --exit-code --cached1、コミット用にステージングされていない変更されたファイル(追加されていないファイル)に対してのみ(false)と評価されることです。賛成票を投じたコメントは、新しいファイルや削除を説明するための最良の解決策です。
ホルヘブカラン2014

2
についてのコメントgit diff-index --quiet HEAD || git commit -m 'bla'は、この質問の答えになるはずです。
ラキブ2016

1
トビはホルガーのコメントによると彼の答えを修正することを気にしなかったので、私は彼の答えを自分で編集しました。
vog 2017年

git diff-index --quiet HEADは、ローカルリポジトリがオリジンで最新であるかどうかをテストしないことに注意してください。
bortzmeyer 2018

62

git commitマニュアルページから:

--allow-empty
    Usually recording a commit that has the exact same tree as its
    sole parent commit is a mistake, and the command prevents you
    from making such a commit. This option bypassesthe safety, and
    is primarily for use by foreign SCM interface scripts.

43
ただし、これは実際にはコミットを作成します。
ThiefMaster 2011年

6
@ThiefMaster:そうですね。これが問題かどうかはOPからはわかりません。自動コミットを使用している場合は、とにかく履歴がクリーンであることを気にしないと思います。
Sven Marnach 2011年

1
回避できるのであれば、コミットしないほうがいいと思います。それを行う方法はありますか?
kojiro 2011年

3
これは質問への答えではありません
manojlds 2011年

7
@manojlds:「もちろん、OPは空のコミットを作成したくありません。」今日は水晶玉を家に置いていったのでわかりませんでした。-pしかし、逃したが、それでも
Sven Marnach 2011年

5
with settings(warn_only=True):
  run('git commit ...')

これにより、ファブリックは障害を無視します。空のコミットを作成しないという利点があります。

の追加レイヤーでラップしてwith hide('warnings'):出力を完全に抑制することができます。そうしないと、コミットが失敗したというメモがファブリック出力に表示されます(ただし、fabfileは引き続き実行されます)。


3
OPは「実際のコミットの失敗を検出したい」と書いています。このコードは、コミットの失敗をすべて非表示にします
bfontaine 2016

-2

赤ちゃんを捕まえてみてください!

from fabric.api import local
from fabric.colors import green


def commit(message='updates'):
    try:
        local('git add .')
        local('git commit -m "' + message + '"')
        local('git push')
        print(green('Committed and pushed to git.', bold=False))
    except:
        print(green('Done committing, likely nothing new to commit.', bold=False))

10
反対票を投じる理由を説明するには:他にもキャッチしたいエラーがある可能性があります。エラーが発生した場合、何もコミットする必要がない可能性があると単純に想定したくはありません。-また、しかしそれは無関係です:代わりにジェネリックexcept:を使用しexcept Exceptionたり、使用したりしないでください。
アルバート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.