如何在git中使用hook防止推送存在未解决的冲突?

3
我想您可以使用pre-receive hook钩子来解决这个问题。
#!/bin/sh
read old_sha1 new_sha1 refname
git diff $old_sha1..$new_sha1 may 

帮助查找冲突标记。
但如何使用正则表达式或其他方法判断此提交中是否存在未解决的冲突? 冲突的表示形式如下:

<<<<<<< HEAD
Conflict resolution is hard;
let's go shopping.
=======
Git makes conflict resolution easy.
>>>>>>> d7785deagea4342532g2q632y321632g23h23
1个回答

9
#!/bin/bash
read old_sha new_sha refname
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?为什么不直接使用 git show $new_sha?此外,您可能需要在正则表达式中使用行首标记 ^ - Daniel Baulig
2
@DanielBaulig 因为 pre-receive 每次推送只会被调用一次,而不是每次提交都会被调用。一系列的提交可能会一次性被推送,这种情况下使用 show 只能得到最后一个提交的差异,而不能得到所有已推送的提交的差异。 - Amber
感谢您的示例脚本。但对我来说,它不能直接使用,因为git diff会在新行前面放置“+”符号。没有“^”的正则表达式可以解决这个问题。 - Ozan
@Ozan 更新包括一个可选的前导 +。谢谢! - Amber
@Amber 可能是斜杠丢失了,你传递给 grep 的正则表达式将匹配行中出现的 >>>>>(因为 ? 应用于 ^+ 正则表达式,它意味着 ^ 重复 1 次或多次,基本上使得 ^ 锚点是可选的)。正确的正则表达式是 ^\+?(<<<<<|>>>>>)^[+]?(<<<<<|>>>>>)(这避免了在各种论坛中格式化此片段时可能被吞没的反斜杠)。 - mkm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接