Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Git预推以防止合并_Bash_Git - Fatal编程技术网

Bash Git预推以防止合并

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

为了避免错误地合并,我为我的git钩子编写了这个bash脚本

在工作中,我们使用git扩展,它会在分支名称前加上前缀,如果您忘记使用refs/for或refs/drafts作为分支名称的前缀,那么您的提交将在远程回购上合并,而无需进行代码检查

这只能发生在具有合并权限的人身上。但有时拥有合并权的人会犯这样的错误

#!/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将永远不会成功-您可能希望将输入保存到字符串中并检查该变量