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

时间:2016-10-06 14:00:50

标签: 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_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,我只允许推送到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'&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

1 个答案:

答案 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}}脚本中复制了此部分。