我希望验证(并在必要时重命名)用户创建的所有标签,以满足我们的规则
例如,如果用户创建了"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”。现在,客户端和服务器都重命名了标记。
我应该说我对我的解决方案不满意吗? 纯客户端解决方案仍然受欢迎。
答案 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
挂钩,并在此处重新命名本地标记。