2011-11-14 3 views
48

git commitを実行するファブリックスクリプトを作成しようとしています。しかし、コミットするものがなければ、gitはステータスが1で終了します。 deployスクリプトはそれを失敗として受け取り、終了します。私は実際に失敗を検出したいので、ファブリックにブランケットにgit commitの失敗を無視するだけでは不十分です。空のコミットの失敗を無視して、デプロイを継続できるようにするにはどうしたらよいですか? git commit manページからgitを使ってエラーなしで何もコミットする方法はありますか?

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

答えて

69

git diffの終了コードを確認してこの状態を事前に把握していますか? (シェルでの)たとえば

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

EDIT:ホルガーさんのコメントによると、固定git diffコマンド。

+47

'git diff'は" porcelain "コマンドであり、スクリプトには使用しないでください。あなたが最も望むのは、 'git diff-index --quiet HEAD || git commit -m 'bla''。 [この回答](http://stackoverflow.com/a/2659808/659002)も参照してください。 – Holger

+0

さらに詳しく説明すると、 'git diff --quiet --exit-code --cached'の問題は、コミットのためにステージングされていない変更されたファイルに対してのみ' 1'(false)と評価されることです)。投票されたコメントは、新しいファイルと削除を考慮に入れる最良のソリューションです。 –

+0

'git diff-index --quiet HEAD ||に関するコメントgit commit -m 'bla''はこの質問の答えになるはずです。 –

41

--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. 
+26

これは実際にコミットを作成します。 – ThiefMaster

+5

@ThiefMaster:そうです。私はOPからこれが問題かどうかはわかりません。私はあなたが自動コミットを使用している場合は、とにかくあなたの履歴がきれいであることに気にしないと思います。 –

+1

私はそれが避けられればコミットしたくないと思う。それを行う方法はありますか? – kojiro

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

これは失敗を無視するファブリックの原因となります。空のコミットを作成しないという利点があります。

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

+0

OPは「私は実際の失敗を検出したいと思います」と書いています。このコードはすべての* failures-to-commitを非表示にします。 – bfontaine

-3

try/catch baby!

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)) 
+6

downvotedになる理由を説明する:他のエラーをキャッチしたいことがあります。エラーが発生した場合には、何もコミットする必要がないかもしれないと仮定したくありません。また、それは無関係です:一般的な 'except:'を使わず、代わりに 'except Exception'などを使用してください。 – Albert

関連する問題