我正在嘗試編寫一個結構腳本,它可以執行git commit
;然而,如果沒有什麼可提交的,git退出的狀態爲1
。部署腳本將其視爲不成功並退出。我確實想檢測實際的失敗提交,所以我不能僅僅爲織物提供git commit
失敗的毛毯忽略。我如何允許忽略空提交失敗,以便部署可以繼續,但是仍然捕獲真實提交失敗時導致的錯誤?如何git提交沒有錯誤沒有?
def commit():
local("git add -p && git commit")
我正在嘗試編寫一個結構腳本,它可以執行git commit
;然而,如果沒有什麼可提交的,git退出的狀態爲1
。部署腳本將其視爲不成功並退出。我確實想檢測實際的失敗提交,所以我不能僅僅爲織物提供git commit
失敗的毛毯忽略。我如何允許忽略空提交失敗,以便部署可以繼續,但是仍然捕獲真實提交失敗時導致的錯誤?如何git提交沒有錯誤沒有?
def commit():
local("git add -p && git commit")
通過檢查git diff的退出碼來預先捕獲這個條件嗎?
例如(在殼):
git add -A
git diff-index --quiet HEAD || git commit -m 'bla'
編輯:根據霍爾格的評論固定git diff
命令。
從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.
雖然這實際上會創建一個提交。 – ThiefMaster
@ThiefMaster:對。我無法從OP得知這是否是一個問題。我猜如果你使用自動提交,你不關心你的歷史是乾淨的反正。 –
如果可以避免,我寧願不承諾。有沒有辦法做到這一點? – kojiro
with settings(warn_only=True):
run('git commit ...')
這會導致織物忽略失敗。具有不創建空提交的優點。
您可以將其包裝在with hide('warnings'):
的附加層中以完全抑制輸出,否則您會在結構輸出中得到提交失敗(但fabfile繼續執行)的提示。
OP寫道:「我確實想要檢測*實際的*失敗 - 提交」;這段代碼將隱藏所有失敗提交。 – bfontaine
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))
要解釋你爲什麼得到低估:可能有其他錯誤,你想趕上。你不想僅僅假設在發生錯誤的情況下,可能不需要承擔任何責任。 - 另外,但這是不相關的:不要使用通用的'except:',而是使用'except Exception'。 – Albert
請注意,'git diff'是一個「瓷器」命令,不應該用於腳本。你最想要的是'git diff-index --quiet HEAD || git commit -m'bla''。另見[這個答案](http://stackoverflow.com/a/2659808/659002)。 – Holger
爲了進一步說明問題,'git diff --quiet --exit-code --cached'的問題在於,它只會針對未經過提交的未修改文件(未添加的文件)評估爲「1」(false) )。最新評論是解決新文件和刪除問題的最佳解決方案。 –
關於'git diff-index --quiet HEAD ||的註釋git commit -m'bla''應該是這個問題的答案。 –