Git 如何防止与放置在远程裸回购上的预接收挂钩发生推送冲突?
我的裸回购协议有两个分支,Master和“desarrollo”,这是西班牙语的发展。我想创建一个预接收钩子,以避免将冲突推到中心位置。这个钩子将被放置在中央裸露的地板上。这就是我所拥有的:Git 如何防止与放置在远程裸回购上的预接收挂钩发生推送冲突?,git,bash,githooks,Git,Bash,Githooks,我的裸回购协议有两个分支,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
#!/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
#/bin/bash
受保护的分支机构
#检查每个正在推动的分支
读取本地\u ref本地\u sha远程\u ref远程\u sha时
做
如果git diff“$old_sha”$new_sha”| grep-qE“^+?()”;然后
echo“在$(basename“$refname”)中看到冲突标记。”
出口1
fi
远程分支=$(echo$remote\u ref | sed-e,.*/\(.*\),\1')
如果[$protected\u branch=$remote\u branch]
然后
echo“中止推送:不允许直接推送到$protected_分支。”
退出1#将不执行推送
fi
完成
出口0
第一部分是防止推送冲突文件,第二部分是防止推送到master,我只允许推送到desarrolo分支。第二部分工作得很好,但是第一部分没有阻止推送,但是当我尝试上传带有标记的文件时,它也不会抛出错误。我希望事务完全失败,不仅仅是拒绝冲突的文件,而是整个推送过程,以防哪怕只有一个文件发生冲突:
if git diff "$old_sha" "$new_sha" | grep -qE '^+?(<<<<<|>>>>>)'; then
echo "Saw a conflict marker in $(basename "$refname")."
exit 1
fi
if git diff“$old_sha”$new_sha”| grep-qE'^+?();然后
echo“在$(basename“$refname”)中看到冲突标记。”
出口1
fi
我必须说我从不同的来源复制了这两个部分,所以变量名一定有问题,我只想知道是旧的变量和新的变量导致了失败,因为我不太擅长制作钩子
编辑:我将字符串比较从5更改为7',而您的while似乎是错误的。 正如您在
git help hooks
中关于pre-receive
一节中所看到的,输入是每行SP-SP-LF
,因此您的while
可能应该是while read old\u-sha new\u-sha refname
。然后,您的原始冲突检查应该是正确的,并且您调整分支保护以使用$refname
而不是$remote\u ref
,然后一切都应该正常工作
您可能是从一个
预推
脚本中复制了这一部分,其中每行的输入是SP LF
。现在它可以工作了,但问题是,无论消息“Saw a conflict marker in desarrollo”是什么,它都会拒绝推送,而且我似乎没有冲突的文件。。。。。git diff--name only--diff filter=U我用该命令检查过,列表为空…..这是我用正确的方法检查bash脚本上的冲突的检查,使用我更改了if字符串,从正则表达式的'You should backslash+
符号。没有这个合并冲突仍然适用
#!/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