是否可以在git repo上设置一个不允许轻量级标签被推送到它的策略?
答案 0 :(得分:3)
默认更新挂钩,启用后 - 并且
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