是否有可能在git仓库上设置策略,禁止推送轻量级标签?
默认的更新钩子,在启用时 - 并且未设置
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
;;
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
update.sample
钩子包括此精确功能(以及其他一些有用的部分)。请查看$GIT_DIR/hooks/update.sample
中的任何现有存储库。 - Chris Johnsen