我希望验证(并在必要时重命名)用户创建的所有标签以满足我们的规则.
例如,如果用户创建了“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.