这是我目前挂在公司服务器上的裸仓库中的钩子:
git push origin master
这个钩子推送到Assembla。
我需要的是当有人将更改推送到我们服务器上的那个分支时,只推送一个分支(主,理想),并忽略推送到其他分支。是否可以从裸仓库中选择分支并仅将该分支推送到Assembla?
答案 0 :(得分:370)
post-receive钩子以<oldrev> <newrev> <refname>
的形式从stdin获取其参数。由于这些参数来自stdin,而不是来自命令行参数,因此您需要使用read
而不是$1 $2 $3
。
post-receive挂钩可以同时接收多个分支(例如,如果某人有git push --all
),所以我们还需要将read
包裹在while
循环中。 / p>
一个工作片段看起来像这样:
#!/bin/bash
while read oldrev newrev refname
do
branch=$(git rev-parse --symbolic --abbrev-ref $refname)
if [ "master" == "$branch" ]; then
# Do something
fi
done
答案 1 :(得分:8)
post-receive hook在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,它仍然可以工作。
答案 2 :(得分:6)
Stefan的回答对我不起作用,但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 :(得分:3)
上述两种解决方案都不适合我。经过多次调试后,事实证明使用'read'命令不起作用 - 相反,解析命令行参数通常的方式正常。
这是我刚刚在CentOS 6.3上成功测试的确切的更新后挂钩。
#!/bin/bash
echo "determining branch"
branch=`echo $1 | cut -d/ -f3`
if [ "master" == "$branch" ]; then
echo "master branch selected"
fi
if [ "staging" == "$branch" ]; then
echo "staging branch selected"
fi
exec git update-server-info
更新:在一个更奇怪的说明中,预接收挂钩通过stdin获取其输入,因此用'read'读取(哇,从没想过我会这么说)。更新后的挂钩对我来说仍然可以使用1美元。
答案 4 :(得分:1)
@pauljz的回答适用于某些git钩子,例如pre-push
,但pre-commit
无法访问这些变量oldrev newrev refname
所以我创建了这个替代版本,适用于预提交,或者真正和钩子。这是一个pre-commit
钩子,如果我们不在husky
分支上,它将运行master
脚本。
#!/bin/bash
# git 'commit' does not have access to these variables: oldrev newrev refname
# So get the branch name off the head
branchPath=$(git symbolic-ref -q HEAD) # Something like refs/heads/myBranchName
branch=${branchPath##*/} # Get text behind the last / of the branch path
echo "Head: $branchPath";
echo "Current Branch: $branch";
if [ "master" != "$branch" ]; then
# If we're NOT on the Master branch, then Do something
# Original Pre-push script from husky 0.14.3
command_exists () {
command -v "$1" >/dev/null 2>&1
}
has_hook_script () {
[ -f package.json ] && cat package.json | grep -q "\"$1\"[[:space:]]*:"
}
cd "frontend" # change to your project directory, if .git is a level higher
# Check if precommit script is defined, skip if not
has_hook_script precommit || exit 0
# Node standard installation
export PATH="$PATH:/c/Program Files/nodejs"
# Check that npm exists
command_exists npm || {
echo >&2 "husky > can't find npm in PATH, skipping precommit script in package.json"
exit 0
}
# Export Git hook params
export GIT_PARAMS="$*"
# Run npm script
echo "husky > npm run -s precommit (node `node -v`)"
echo
npm run -s precommit || {
echo
echo "husky > pre-commit hook failed (add --no-verify to bypass)"
exit 1
}
fi
我希望能有所帮助。您可以根据自己的需要轻松修改if
和fi
语句之间的任何内容。
答案 5 :(得分:0)
我为自己编写了一个PHP脚本来执行此功能。
https://github.com/fotuzlab/githubdump-php
在您的服务器上托管此文件,最好是repo root并在github webhooks中定义url。使用您的分支名称更改第8行的'allcommits',并在第18行添加您的代码/功能。
e.g。
function githubdump($payload_object) {
// Write your code here.
exec('git push origin master');
}
答案 6 :(得分:0)