我正在尝试使用GIT中的Pre-push hook创建一个检查点,我正在检查本地分支和远程分支名称是否相同。
仅当本地和远程分支相同时才允许推送。我在预推样本钩子文件中尝试这样的东西,但它无法正常工作。请建议。
while read local_ref local_sha remote_ref remote_sha
do
if [ "$local_ref" != "$remote_ref" ]
then
echo " Please check Remote and local branch names";
exit 1
else
exit 0
fi
done
更新:我的本地分支是" git push命令" Mybranch 和远程分支是 refs / for / Mybranch
所以即使我的分支名称是相同的,它给我错误,我如何只从远程排除/ refs / for中提取分支名称?
Git push命令:
git push origin Mybranch:refs/for/Mybranch
答案 0 :(得分:0)
一般情况下,你不应该假设refs/heads/
或refs/for/
,因为你的钩子将用于标记推送(refs/tags/
)和其他推送(例如,refs / notes /,也许refs / stash等等。
请注意,您(或任何人)可以运行,例如git push there refs/heads/master:refs/for/something refs/tags/v1.2:refs/tags/v1.2 refs/remotes/origin/master:refs/heads/master
同时请求推送三个内容,这就是为什么您必须在预推钩中循环读取所有请求。< / p>
您在评论中建议您使用:
remote_ref >> remote.txt
remote_ref1 = cat remote.txt | cut -d'/' -f3
rm remote.txt
有一些语法错误。
检查前缀是否明智,如果它符合您的期望并希望处理,请删除前缀。不要只提取第三个单词,因为如果您使用名为feature/tall
的分支,或者正在使用除前两个组件之外的其他结构的引用(远程跟踪分支工作此例如,虽然通常你不会推它们。)
在sh / bash脚本语言中,您可以编写,例如:
case $local_ref in
refs/heads/*)
local_type=branch
local_short=${local_ref#refs/heads/}
;;
*)
local_type=unknown
;;
esac
case $remote_ref in
refs/heads/*)
remote_type=branch
remote_short=${remote_ref#refs/heads/}
;;
refs/for/*)
remote_type=gerrit
remote_short=${remote_ref#refs/for/}
;;
*)
remote_type=unknown
;;
esac
现在您已经解码了引用类型并找到了已知案例的简短版本,您可以编写每个案例的逻辑,然后根据需要进行扩展:
case $local_type,$remote_type in
branch,branch|branch,gerrit)
# push from branch to branch, or from branch to gerrit:
# require that the shortened names match exactly (for now)
if [ $local_short != $remote_short ]; then
echo "push to $remote_type requires paired names" 1>&2
echo "but you are pushing from $local_short to $remote_short" 1>&2
exit 1
fi
;;
*)
# echo "unknown reference type - allowing" 1>&2 # uncomment for debug
;;
esac
所有这些都将进入主while read ...
循环。如果你到了循环的末尾, all 你正在推送的引用已被验证(因为没有被echo和退出代码拒绝)。