Bash Git预推以防止合并
为了避免错误地合并,我为我的git钩子编写了这个bash脚本 在工作中,我们使用git扩展,它会在分支名称前加上前缀,如果您忘记使用refs/for或refs/drafts作为分支名称的前缀,那么您的提交将在远程回购上合并,而无需进行代码检查 这只能发生在具有合并权限的人身上。但有时拥有合并权的人会犯这样的错误Bash Git预推以防止合并,bash,git,Bash,Git,为了避免错误地合并,我为我的git钩子编写了这个bash脚本 在工作中,我们使用git扩展,它会在分支名称前加上前缀,如果您忘记使用refs/for或refs/drafts作为分支名称的前缀,那么您的提交将在远程回购上合并,而无需进行代码检查 这只能发生在具有合并权限的人身上。但有时拥有合并权的人会犯这样的错误 #!/bin/sh if [[ `grep 'refs/for'` ]]; then echo "push to refs/for/ authorized" elif [[ `g
#!/bin/sh
if [[ `grep 'refs/for'` ]]; then
echo "push to refs/for/ authorized"
elif [[ `grep 'refs/drafts/'` ]]; then
echo "push to refs/drafts/ authorized"
else
echo "PUSH DENIED, MERGE DETECTED, please merge using gerrit 'submit' button only"
exit 1
fi
如果我按到refs/for/v1.1.x,它将得到push-to-refs/for/authorized
但是,如果我推到refs/drafts/v1.1.x,则推拒绝,检测到合并,请仅使用gerrit“提交”按钮进行合并
这是怎么可能的,条件语法完全相同
谢谢。因为,您的第一个grep命令读取所有输入,检查refs/for。第二个grep读取剩余的输入;因为您的第一个读取了所有输入,所以没有一个保留。因此,第二个永远也找不到任何东西
你可以用很多不同的方法来处理这个问题。一种是将stdin复制到可以重复读取的临时文件中。另一种方法是构造钩子,以便只读取一次输入,检查每一行的每个条件。第二种方法显然更有效,尽管这种明显性是一种错觉,这取决于我在这里不打算讨论的细节
无论如何,我写这篇文章的方式是:
#! /bin/sh
summary_status=0 # assume all OK initially
while read lref lhash rref rhash; do
case $rref in
refs/for/*|refs/draft/*) echo "push to $rref ok";;
*) echo "push to $rref not ok"; summary_status=1;;
esac
done
exit $summary_status
此变体不需要bash特性,因此在中使用/bin/sh而不是/bin/bash!线如果你把它改成了一个,一定要把它改成一个!线它只读取一次输入。它还验证您是否未运行,例如:
git push remote master:refs/for/master develop
由于一个正常,另一个不正常,您现有的脚本将允许该操作。第一个grep将消耗所有输入,因此第二个grep将永远不会成功-您可能希望将输入保存到字符串中并检查该变量