Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 如何防止与放置在远程裸回购上的预接收挂钩发生推送冲突?_Git_Bash_Githooks - Fatal编程技术网

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

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

我的裸回购协议有两个分支,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
#/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