编写一个git post-receive hook来处理特定的分支

Jor*_*rte 103 git hook repository git-bare

这是我目前挂在公司服务器上的裸仓库中的git push origin master 钩子: 这个钩子推送到Assembla.我需要的是当有人将更改推送到我们服务器上的那个分支时,只推送一个分支(主,理想),并忽略推送到其他分支.是否可以从裸仓库中选择分支并仅将该分支推送到Assembla?

pau*_*ljz 378

post-receive钩子从形式的stdin中获取其参数<oldrev> <newrev> <refname>.由于这些参数来自stdin,而不是来自命令行参数,因此您需要使用read而不是$1 $2 $3.

post-receive挂钩可以同时接收多个分支(例如,如果有人做了git push --all),所以我们还需要将其包装read在一个while循环中.

一个工作片段看起来像这样:

#!/bin/bash
while read oldrev newrev refname
do
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)
    if [ "master" = "$branch" ]; then
        # Do something
    fi
done
Run Code Online (Sandbox Code Playgroud)

  • 这应该标记为正确的答案. (52认同)
  • @Ray,你有`#!/ bin/sh`而不是`#!/ bin/bash`? (5认同)
  • "=="对我不起作用.单身"="对我很有用. (2认同)
  • 我能想到的一个风险是标签,因为它们的名称可能与分支名称重叠.如果你寻找`refs/heads/master`而不是`refs/tags/master`你应该没问题.可能还有其他类似的边缘情况我无法想到.它本身可能是一个很好的StackOverflow问题. (2认同)

ebn*_*ter 8

后接收挂钩在stdin上获取的最后一个参数是ref被更改的内容,因此我们可以使用它来检查该值是否为"refs/heads/master".类似于我在post-receive钩子中使用的一些ruby:

STDIN.each do |line|
    (old_rev, new_rev, ref_name) = line.split
    if ref_name =~ /master/
         # do your push
    end
end
Run Code Online (Sandbox Code Playgroud)

请注意,它为每个推送的ref获取一行,因此如果您推送的不仅仅是master,它仍然可以工作.


Dea*_*her 6

Stefan的回答对我不起作用,但是这样做了:

#!/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"
Run Code Online (Sandbox Code Playgroud)