2011-11-14 54 views
48

我正在嘗試編寫一個結構腳本,它可以執行git commit;然而,如果沒有什麼可提交的,git退出的狀態爲1。部署腳本將其視爲不成功並退出。我確實想檢測實際的失敗提交,所以我不能僅僅爲織物提供git commit失敗的毛毯忽略。我如何允許忽略空提交失敗,以便部署可以繼續,但是仍然捕獲真實提交失敗時導致的錯誤?如何git提交沒有錯誤沒有?

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

回答

69

通過檢查git diff的退出碼來預先捕獲這個條件嗎?

例如(在殼):

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

編輯:根據霍爾格的評論固定git diff命令。

+47

請注意,'git diff'是一個「瓷器」命令,不應該用於腳本。你最想要的是'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

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

雖然這實際上會創建一個提交。 – ThiefMaster

+5

@ThiefMaster:對。我無法從OP得知這是否是一個問題。我猜如果你使用自動提交,你不關心你的歷史是乾淨的反正。 –

+1

如果可以避免,我寧願不承諾。有沒有辦法做到這一點? – kojiro

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

這會導致織物忽略失敗。具有不創建空提交的優點。

您可以將其包裝在with hide('warnings'):的附加層中以完全抑制輸出,否則您會在結構輸出中得到提交失敗(但fabfile繼續執行)的提示。

+0

OP寫道:「我確實想要檢測*實際的*失敗 - 提交」;這段代碼將隱藏所有失敗提交。 – 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

要解釋你爲什麼得到低估:可能有其他錯誤,你想趕上。你不想僅僅假設在發生錯誤的情況下,可能不需要承擔任何責任。 - 另外,但這是不相關的:不要使用通用的'except:',而是使用'except Exception'。 – Albert