如何防止推送与放置在远程裸仓库上的预接收挂钩发生冲突?

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,我只允许推送到desa​​rrollo分支。第二部分工作得很好,但第一部分并没有阻止推送,但是当我尝试上传带有标记的文件时它也不会抛出错误。我希望交易完全失败,不仅仅是拒绝冲突的文件,而是拒绝整个推送,以防单个文件发生冲突:

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