微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

git hook pre-push bash脚本验证标签

如何解决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 举报,一经查实,本站将立刻删除。