我的裸仓库有两个分支,Master和“desarrollo”,这是西班牙语的发展。我想创建一个预接收挂钩,以避免冲突到中央裸。这个钩子将位于中央裸露处。这就是我所拥有的:
#!/bin/bash
protected_branch='master'
# check each branch being pushed
while read local_ref local_sha remote_ref remote_sha
do
if git diff "$old_sha" "$new_sha" | grep -qE '^+?(<<<<<|>>>>>)'; then
echo "Saw a conflict marker in $(basename "$refname")."
exit 1
fi
remote_branch=$(echo $remote_ref | sed -e 's,.*/\(.*\),\1,')
if [ $protected_branch = $remote_branch ]
then
echo "ABORT PUSH: Not allowed to push directly to $protected_branch."
exit 1 # push will not execute
fi
done
exit 0
第一部分是防止冲突文件的推送,第二部分是防止推送到master,我只允许推送到desarrollo分支。第二部分工作正常,但第一部分并没有阻止推送,但是当我尝试上传带有标记的文件时,它也不会抛出错误。我希望事务完全失败,不仅仅是拒绝冲突的文件,而是整个推送以防万一冲突中只有一个文件:
if git diff "$old_sha" "$new_sha" | grep -qE '^+?(<<<<<|>>>>>)'; then
echo "Saw a conflict marker in $(basename "$refname")."
exit 1
fi
我必须说我从不同来源复制了两个部分,所以变量名称一定有问题,我只想知道old_sha和new_sha变量是导致失败的原因,因为我不是特别好制作钩子
编辑:我将字符串比较从5更改为7'&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;现在它完美无缺,最终的脚本是
#!/bin/bash
protected_branch='master'
# check each branch being pushed
while read old_sha new_sha refname
do
if git diff "$old_sha" "$new_sha" | grep -qE '^+?(<<<<<<<|>>>>>>>)'; then
echo "Saw a conflict marker in $(basename "$refname")."
exit 1
fi
remote_branch=$(echo $refname | sed -e 's,.*/\(.*\),\1,')
if [ $protected_branch = $remote_branch ]
then
echo "ABORT PUSH: Not allowed to push directly to $protected_branch."
exit 1 # push will not execute
fi
done
exit 0
答案 0 :(得分:1)
你的时间似乎是错的。
正如您在关于git help hooks
的部分pre-receive
中看到的那样,每行的输入为<old-value> SP <new-value> SP <ref-name> LF
,因此while
可能应为while read old_sha new_sha refname
。然后您的原始冲突检查应该是正确的,并且您使分支保护适应使用$refname
而不是$remote_ref
,那么一切都应该可行。
您可能从每行输入pre-push
的{{1}}脚本中复制了此部分。