2017-08-03 10 views
0

私はpost-receive gitのフックを持っています。gitコマンドが失敗した場合、git hookスクリプトを終了するには?

#!/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')を実行すると、チェックされていないコマンドが失敗したときに自動的にシェルが行います。 – PSkocik

+0

@PSkocik '-e'は、その直感的でない意味のために一般的には推奨されません。 [set -e not inside()||](https://unix.stackexchange.com/questions/65532/why-does-set-e-not-work-inside)を参照してください。 – hvd

+0

@hvdええ、それは絶対に 'set -e'を気にしますが、私はまだシンプルなシェルスクリプトはデフォルトで' set -e'にするべきだと思います。あまりにも悪いのはライブラリシェル関数でそれに頼ることはできません。 : – PSkocik

答えて

1

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

と同じ方法を使用すると、任意のシェルコマンドのステータスをチェック:リターンコードを見ることで。

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

あなたはいませんあなたが有用なエラーメッセージを出したいのであれば、 '||'と一緒に行こうと思っていましたが、シェル関数と組み合わせて、 '|| fail"コマンドの行に何か失敗しました。後でスクリプトを読んでいるときにそれほど気をそらすことはありません。 – hvd

関連する問題