无法从Git post-receive hook中检测到分支

时间:2011-05-12 05:47:04

标签: git hook git-post-receive

我在远程仓库上设置了一个接收挂钩设置,试图确定传入推送的分支名称,如下所示:

$branch = `git rev-parse --abbrev-ref HEAD`

我发现,无论我从我的$ branch变量推送什么分支都设置为'master'。

有什么想法吗?

5 个答案:

答案 0 :(得分:24)

post-receive hook获取与pre-receive相同的数据,而不是参数,而是来自stdin。所有参考都发送以下内容:

oldRev(space)newRev(space)refName(换行)

您可以使用此bash脚本解析引用名称:

while read oldrev newrev ref
do
    echo "$ref"
done

答案 1 :(得分:10)

你也可以使用bash变量替换来做这样的事情:

read oldrev newrev ref

branchname=${ref#refs/heads/}

git checkout ${branchname}

答案 2 :(得分:2)

马格努斯的解决方案对我没有用,但this做了:

#!/bin/bash

echo "determining branch"

if ! [ -t 0 ]; then
  read -a ref
fi

IFS='/' read -ra REF <<< "${ref[2]}"
branch="${REF[2]}"

if [ "master" == "$branch" ]; then
  echo 'master was pushed'
fi

if [ "staging" == "$branch" ]; then
  echo 'staging was pushed'
fi

echo "done"

答案 3 :(得分:2)

这两个答案都是正确的,但我无法将stdin用于收到邮件后的下一个常用功能。以下是我最终的结果:

read oldrev newrev ref
echo "$oldrev" "$newrev" "$ref" | . /usr/share/git-core/contrib/hooks/post-receive-email


if [ "refs/heads/qa" == "$ref" ]; then
  # Big Tuna YO!
  wget -q -O - --connect-timeout=2 http://127.0.0.1:3000/hooks/build/qa_now
fi

答案 4 :(得分:1)

您需要读取传递给脚本的参数。这应该有分支名称和新旧修订版,并为每个分支推送

相关问题