2017-08-03 91 views
0

我有一個混帳post-receive鉤:如果git命令失敗,如何退出git鉤子腳本?

#!/bin/bash 

while read oldrev newrev refname 
do 
    branch=$(git rev-parse --symbolic --abbrev-ref $refname) 
    if [ -n "$branch" ] && [ "master" == "$branch" ]; then 
     working_tree="/path/to/working/dir" 
     GIT_WORK_TREE=$working_tree git checkout $branch -f 
     GIT_WORK_TREE=$working_tree git pull 
     <more instructions> 
    fi 
done 

如何檢查一個Git命令的狀態和持續如果失敗停止腳本?

類似以下內容:

#!/bin/bash 

while read oldrev newrev refname 
do 
    branch=$(git rev-parse --symbolic --abbrev-ref $refname) 
    if [ -n "$branch" ] && [ "master" == "$branch" ]; then 
     working_tree="/path/to/working/dir" 
     GIT_WORK_TREE=$working_tree git checkout $branch -f 
     GIT_WORK_TREE=$working_tree git pull 
     if [ <error conditional> ] 
      echo "error message" 
      exit 1 
     fi 
    fi 
done 
+1

用'運行它/ bin/bash -e'(或者'set -e' =='set -o errexit'),並且shell會在未經檢查的命令失敗時自動爲您執行。 – PSkocik

+0

@PSkocik'-e'通常因爲其不直觀的語義而受到阻礙。請參閱[爲什麼set -e不能在()||]內工作(https://unix.stackexchange.com/questions/65532/why-does-set-e-not-work-inside)。 – hvd

+0

@ hvd是的,這絕對是'set -e',但我仍然認爲簡單的shell腳本默認應該是'set -e'。太糟糕了,因爲你提到的行爲,在圖書館的shell函數中不能依賴它。 :( – PSkocik

回答

1

How can I check the status of a git command and stop the script from continuing if it fails?

以同樣的方式,你檢查任何shell命令的狀態:通過查看返回碼。您可以在命令退出後檢查shell變量$?的值,如:

GIT_WORK_TREE=$working_tree git pull 
if [ $? -ne 0 ]; then 
    exit 1 
fi 

,或者使用命令本身作爲條件的一部分,如:

if ! GIT_WORK_TREE=$working_tree git pull; then 
    exit 1 
fi 
+1

這似乎是不必要的詳細信息'|| exit 1'就足夠了 – hvd

+0

如果你想發出某種有用的錯誤信息(OP在問題中做什麼),那麼不是。 – larsks

+0

而你不是如果你想發出一個有用的錯誤信息,我會使用'||',但是與shell函數一起使用:'|| fail「命令行失敗,''與'fail(){echo「error:$ 1」>&2; exit 1;}'。當你稍後閱讀腳本時,這不會分散注意力。 – hvd

相關問題