17

dirpost-receive-emailからのスクリプトに基づいて受信後のフックを書いていますが、引数と引数が空のようです。contriboldrevnewrev

スクリプトは次のようになります。

#!/bin/bash

oldrev=$(git rev-parse $1)
newrev=$(git rev-parse $2)

スクリプトはプッシュで実行されますが$1、、、および$2はすべて空です。それを実行するために何かを構成する必要がありますか?$oldrev$newrev

(リポジトリは、gitolite重要な場合によって作成されました)

4

5 に答える 5

53

継続的インテグレーションサーバーをセットアップしているときに、この問題に遭遇しました。引数はコマンドラインを介してpost-receiveに渡されるのではなく、STDINを介して渡されるため、readコマンドを使用して引数をフェッチする必要があります。これが私がそれをした方法です:

#!/bin/sh
read oldrev newrev refname
BRANCH=${refname#refs/heads/} 
curl --request POST "http://my.ci.server/hooks/build/myproject_$BRANCH"
于 2011-01-26T17:03:54.190 に答える
12

情報はSTDINを介して渡されますが、引数はありません。bashからその情報を読み取るには、次のようにします。

read oldrev newrev refname
echo "Old revision: $oldrev"
echo "New revision: $newrev"
echo "Reference name: $refname"

すでに投稿されている回答をまとめています。

于 2012-11-12T10:53:45.483 に答える
9

フックはpost-receive引数を取りません。マニュアルを引用する(強調を追加):

このフックは、リモートリポジトリのgit-receive-packによって呼び出されます。これは、ローカルリポジトリでgitpushが実行されたときに発生します。すべての参照が更新された後、リモートリポジトリで実行されます。

このフックは、受信操作に対して1回実行されます。引数は取りませんpre-receiveが、フックが標準入力で行うのと同じ情報を取得します。

git-receive-packこのフックは、実際の作業が完了した後に呼び出されるため、の結果には影響しません。

post-updateこれは、名前に加えてすべての参照の古い値と新しい値の両方を取得するという点で、フックに取って代わります。

標準出力と標準エラー出力の両方がgit send-packもう一方の端に転送されるため、ユーザーへのメッセージを簡単にエコーできます。

デフォルトのpost-receiveフックは空ですが、コミットメールの送信を実装するサンプルスクリプトがgitディストリビューションpost-receive-emailのディレクトリに提供されています。contrib/hooks

于 2010-09-21T16:48:48.170 に答える
3

Françoisスクリプトのより精巧なバージョンは次のようになります

#!/bin/bash

JENKINS_URL="http://192.168.1.116/jenkins"
GIT_URL="git@bitbucket.org:nuclos/nuclos.git"

# remove all spaces and newlines from ARG
trim() {
  local ARG="$1"
  shift
  echo -e "$ARG" | tr -d "[:space:]\n" 
}

# unique sort ARG items separated by newlines
unique() {
  local ARG="$1"
  shift
  echo -e "$ARG" | sort -u -i
}

# cut first and last character from ARG
cutfl() {
  local ARG="$1"
  shift
  local LEN="${#ARG}"
  let LEN="$LEN - 2"
  echo "${ARG:1:$LEN}"
}
BRANCHES=""
while read oldrev newrev refname; do
  BRANCH=`trim ${refname#refs/heads/}`
  if [ -n "$BRANCH" ]; then
    BRANCHES+="${BRANCH}\n"
  fi
done

BRANCHES=`unique "$BRANCHES" | tr '\n' ','`
BRANCHES=`cutfl "$BRANCHES"`
echo wget -q -O - "$JENKINS_URL/git/notifyCommit?url=$GIT_URL&branches=$BRANCHES"
at "now + 5 minutes" <<END
wget -q -O - "$JENKINS_URL/git/notifyCommit?url=$GIT_URL&branches=$BRANCHES"
END

このバージョンは複数のブランチに対応でき、各ブランチに対して1つのビルドのみをトリガーします。

于 2013-03-08T09:07:35.973 に答える
1

実際、サンプルスクリプトpost-receive.sampleには次のコメントがあるため、「引数を取りません」は受け入れません。

# The "post-receive" script is run after receive-pack has accepted a pack
# and the repository has been updated.  It is passed arguments in through
# stdin in the form
#  <oldrev> <newrev> <refname>
# For example:
#  aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master
于 2011-02-07T03:18:43.103 に答える