git:post-receive hook中的空参数

时间:2010-09-21 15:54:32

标签: git bash githooks

我正在根据post-receive-email目录中的contrib脚本编写post-receive hook,但似乎oldrevnewrev参数为空。< / p>

脚本如下所示:

#!/bin/bash

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

该脚本在推送时运行,但所有$1$2$oldrev$newrev都为空。我应该配置一些东西让它运行吗?

(存储库由gitolite创建,如果它确实重要的话)

5 个答案:

答案 0 :(得分:51)

我在设置持续集成服务器时偶然发现了这个问题。由于参数未通过命令行传递给post-receive,因此必须使用read命令。我是这样做的:

#!/bin/sh
read oldrev newrev refname
BRANCH=${refname#refs/heads/} 
curl --request POST "http://my.ci.server/hooks/build/myproject_$BRANCH"

答案 1 :(得分:10)

post-receive挂钩不带任何参数。 Quoth the manual(强调补充):

  

此挂钩由远程存储库上的git-receive-pack调用,这在本地存储库上执行git push时会发生。在更新所有引用后,它会在远程存储库上执行一次。

     

此挂钩执行一次以进行接收操作。 不需要参数,但获取与pre-receive挂钩在其标准输入上所做的相同的信息。

     

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

     

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

     

标准输出和标准错误输出都转发到另一端的git send-pack,因此您只需为用户回复消息。

     

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

答案 2 :(得分:9)

虽然信息是通过STDIN传递的,但没有任何参数。要从bash中读取该信息,只需执行以下操作:

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

我只是总结已发布的答案。

答案 3 :(得分: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

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

答案 4 :(得分: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