17

post-receive-email我正在根据目录中的脚本编写接收后挂钩contrib,但似乎oldrevandnewrev参数是空的。

脚本如下所示:

#!/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钩子不接受任何参数。Quoth手册(强调添加):

这个钩子由远程存储库上的 git-receive-pack 调用,当在本地存储库上完成 git push 时会发生这种情况。在所有 refs 都更新后,它会在远程存储库上执行一次。

该钩子为接收操作执行一次。它不接受任何参数,但获得的信息与pre-receive钩子在其标准输入上的信息相同。

这个钩子不会影响 的结果git-receive-pack,因为它是在实际工作完成后调用的。

这取代了post-update钩子,因为除了它们的名称之外,它还获取所有 ref 的旧值和新值。

标准输出和标准错误输出都转发到git send-pack另一端,因此您可以简单地为用户回显消息。

默认的post-receivehook 是空的,但是在 git 分发post-receive-email的目录中提供了一个示例脚本contrib/hooks,它实现了发送提交电子邮件。

于 2010-09-21T16:48:48.170 回答
3

弗朗索瓦脚本的更详细版本将是

#!/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

这个版本可以处理多个分支,并且每个分支只触发一个构建。

于 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 回答