为了账号安全,请及时绑定邮箱和手机立即绑定

编写git post-receive钩子以处理特定分支

编写git post-receive钩子以处理特定分支

Git
皈依舞 2019-10-05 14:34:03
这是我当前存放在公司服务器中的裸存储库中的git push origin master 钩子: 该钩子将推到Assembla。我需要的是,当有人将更改推送到我们服务器上的该分支时,仅推送一个分支(理想情况下为master),而忽略推送到其他分支。是否可以从裸仓库中选择分支,然后仅将该分支推送到Assembla?
查看完整描述

3 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

接收后挂钩从stdin中以形式获取参数<oldrev> <newrev> <refname>。由于这些参数来自标准输入,而不是命令行参数,因此需要使用read代替$1 $2 $3。


后收到钩可以接收多个分支一次(例如,如果有人做了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


查看完整回答
反对 回复 2019-10-05
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

接收后挂钩在stdin上获得的最后一个参数是ref的更改,因此我们可以使用它来检查该值是否为“ refs / heads / master”。红宝石有点类似于我在接收后挂钩中使用的红宝石:


STDIN.each do |line|

    (old_rev, new_rev, ref_name) = line.split

    if ref_name =~ /master/

         # do your push

    end

end

请注意,对于推送的每个引用,它都会获得一行,因此,如果您推送的不仅仅是master,它仍然可以工作。


查看完整回答
反对 回复 2019-10-05
?
慕沐林林

TA贡献2016条经验 获得超9个赞

斯特凡的答案并没有为我工作,但这样做的:


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


查看完整回答
反对 回复 2019-10-05
  • 3 回答
  • 0 关注
  • 1225 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信