如何防止推送与放置在远程裸仓库上的预接收挂钩发生冲突?
How to prevent pushing conflicts with a pre-receive hook placed on the remote bare repo?
我的裸仓库有两个分支,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,.*/\(.*\),,')
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 '<<<<<<<' 现在它运行良好,最终脚本是
#!/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,.*/\(.*\),,')
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
你的时间好像不对。
正如您在 pre-receive
部分的 git help hooks
中看到的那样,输入是每行 <old-value> SP <new-value> SP <ref-name> LF
,因此您的 while
可能应该是 while read old_sha new_sha refname
。那么你原来的冲突检查应该是正确的,你调整分支保护以使用 $refname
而不是 $remote_ref
,那么一切都应该可以工作。
您可能从 pre-push
脚本复制了这一部分,其中每行输入 <local ref> SP <local sha1> SP <remote ref> SP <remote sha1> LF
。
我的裸仓库有两个分支,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,.*/\(.*\),,')
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 '<<<<<<<' 现在它运行良好,最终脚本是
#!/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,.*/\(.*\),,')
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
你的时间好像不对。
正如您在 pre-receive
部分的 git help hooks
中看到的那样,输入是每行 <old-value> SP <new-value> SP <ref-name> LF
,因此您的 while
可能应该是 while read old_sha new_sha refname
。那么你原来的冲突检查应该是正确的,你调整分支保护以使用 $refname
而不是 $remote_ref
,那么一切都应该可以工作。
您可能从 pre-push
脚本复制了这一部分,其中每行输入 <local ref> SP <local sha1> SP <remote ref> SP <remote sha1> LF
。