如何使用git hook自动重命名标签?

我希望验证(并在必要时重命名)用户创建的所有标签以满足我们的规则.

例如,如果用户创建了“v1.2.3”标记,则应将其自动重命名为“v1.02.03”.

不幸的是,git tag命令不会调用git hook.

这就是为什么我实现了pre-push hook,它删除旧标记并在同一次提交中创建新标记(带有修改名称).

问题是git push –tags将OLD TAGS发送到远程repo而不是NEW TAGS(尽管在pre-push hook删除之后旧的标签不再存在).

在将它们推送到远程仓库之前,如何在本地仓库上自动重命名标签?

编辑:
我通过将标签重命名逻辑复制到服务器端的post-receive hook解决了我的问题.
至于现在,标签“v1.2.3”在客户端通过预推钩重命名为“v1.02.03”,但是旧标签名称(“v1.2.3”)被推送到远程仓库,并且在远程仓库上“ v1.2.3“通过post-receive hook再次重命名为”v1.02.03“.现在,客户端和服务器都重命名了标记.

我应该说我对我的解决方案不满意吗?
纯客户端解决方案仍然受欢迎.

最佳答案 不是核心git专家,但这是我的假设:当你使用–tags标志时,所有的refs在执行钩子之前已经存储在内存中.从git-push的手册页:

   --tags
       All refs under refs/tags are pushed, in addition to refspecs explicitly listed on the command line.

由于引用已存在于内存中,因此预推钩更改标记名称/删除和创建新标记不会产生任何影响.

IMO,为了处理这种情况,在更改所有标记名称后,即使一个标记命名不正确,也可以简单地修改预推钩.之后,再次进行预推.

或者,您可以使用自定义命令 – git别名,根据您的要求重命名所有标记,然后调用git push –tags.检查How to embed bash script directly inside a git alias.

点赞