需要带注释的标签并拒绝git push上的轻量级标签

时间:2011-07-21 01:33:45

标签: git git-tag

是否可以在git repo上设置一个不允许轻量级标签被推送到它的策略?

2 个答案:

答案 0 :(得分:3)

Git hook page提及:

  

默认更新挂钩,启用后 - 并且 hooks.allowunannotated 配置选项未设置或设置为false - 可以防止未注释的标记被推送。

在评论中反过来提及update.sample Chris Johnsen

case "$refname","$newrev_type" in
    refs/tags/*,commit)
        # un-annotated tag
        short_refname=${refname##refs/tags/}
        if [ "$allowunannotated" != "true" ]; then
            echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
            echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
            exit 1
        fi
        ;;

答案 1 :(得分:1)

git push的角度在接收(远程)存储库上调用更新挂钩。有时,您无权访问远程存储库上的挂钩;据我所知,这就是GitHub的情况(很高兴允许推送轻量级标签)。

为了防止从本地存储库中推送轻量级标记,您可以将其添加到.git/hooks/pre-push中的阅读循环体,从pre-push.sample复制:

case "$local_ref" in
    refs/tags/*)
        if [ `git cat-file -t "$local_ref"` == 'commit' ]
        then
            echo >&2 "Tag $local_ref is not annotated, not pushing"
            exit 1
        fi
        ;;
esac

然而,我认为最好的解决方案是避开整个问题。 带注释的标签可以与任何可以访问这些标签的引用一起自动推送。配置变量push.followTags启用了此行为,因此您可以默认执行正确的操作,并且几乎不必显式推送标记:

git config --global push.followTags true