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

时间:2016-11-29 08:58:57

标签: git githooks git-tag

我希望验证(并在必要时重命名)用户创建的所有标签,以满足我们的规则 例如,如果用户创建了"v1.2.3"标记,则应将其自动重命名为"v1.02.03"

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

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

问题是git push --tags将OLD TAGS发送到远程仓库而不是NEW TAGS(尽管在预推钩删除它们之后旧标签不再存在)。

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

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

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

2 个答案:

答案 0 :(得分:2)

不是核心git专家,但这是我的假设:当你使用--tags标志时,所有引用都已经在执行挂钩之前存储在内存中。从git-push的手册页:

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

由于refs已经存在于内存中,因此预推钩更改标签名称/删除和创建新标签没有任何效果。

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

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

答案 1 :(得分:0)

您可以在客户端映射到pre-push挂钩,并在此处重新命名本地标记。