如何解决git hook pre-push bash脚本验证标签
我正在尝试使用预推git钩子来验证git标签,但是每当我执行git push origin <tag-name>
时,它都会使用/ refs / tags中的最新标签作为最新标签。
要复制该问题:
Step 1. git commit
step 2. git tag V1.0.0-US123-major
step 3. git push origin V1.0.0-US123-major
因此,当执行第3步时,预推脚本应使用 “ V1.0.0-US123-major” 标签,并针对以下正则表达式进行验证。如果该标签与正则表达式匹配,则它是有效标签,否则中止git push。
#!/bin/sh
read_tag="$(git describe --abbrev=0 --tags)"
if [[ $read_tag =~ (^v[0-9]{1}.[0-9]{1}.[0-9]{1}-[a-zA-Z]+-[a-zA-Z]+$) ]]; then
echo "matched"
else
echo "not matched"
exit 1
fi
我的期望是当我使用git push origin 2.2.2.2
时,预推送脚本不会返回exit1而是会接受标记并推送到不正确的原点。
git push origin 2.2.2
latest tag: v5.5.5-abcd-tues
matched
有人可以帮我吗?
解决方法
您的pre-push
钩子正在检查当前修订,而不是您要推送的标签,因为如果没有另外指定,git describe
将描述HEAD
。
使用pre-push
挂钩时,要推送的引用将在标准输入中传递。假设您要检查的是 remote 引用的名称(即将要在服务器上结束的引用),那么它可能看起来像这样(使用POSIX语法):
#!/bin/sh
set -e
while read lref new rref old
do
case $rref in
refs/tags/*)
if echo "$rref" | \
grep -qsE '(^refs/tags/v[0-9]{1}.[0-9]{1}.[0-9]{1}-[a-zA-Z]+-[a-zA-Z]+$)'
then
echo "matched"
else
echo "not matched"
exit 1
fi;;
*)
;;
esac
done
请注意,尽管pre-push
钩子可以帮助开发人员做出正确的选择并避免错误,但它不是有效的控件,因为它可以被忽略。如果需要限制发送到服务器的内容,则需要使用pre-receive
挂钩,服务器实现或CI系统来完成。有关更多信息,请参见the relevant Git FAQ entry。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。