如何阻止用户推送所有标签(git push --tags)?

10
我们在发现git标签可以用斜杠命名以便将它们排列在文件夹结构中之前创建了许多标签。现在,想要摆脱命名错误的标签非常困难,因为尽管我在服务器上删除了命名错误的标签,但突然间有人没有删除他们本地的标签就推送了所有标签,然后旧的和新的标签都再次出现在服务器上。
我们使用SourceTree作为git客户端(是的,我已经四处走动并确保每个人都取消了“推送所有标签”复选框,但新人到来并更换电脑),以及Visual Studio Team Services Git存储库。
我希望每个人都能够单独创建和推送标签,我只是想避免那些大量推送标签的情况。
我阅读了这篇文章git pre-push hook, don't run if is --tags,但解决方案似乎在Windows上不起作用。

我已经四处走动,确保每个人都取消了“推送所有标签”复选框——也许你应该四处走动并询问人们删除过时的标签。但它们真的那么麻烦吗?在你的存储库中拥有一些旧标签有什么大不了的呢? - Chris
是的,我确实可以这样做,但这意味着有些管理工作我真的没有时间去做。而且它很可能会在稍后以错误的格式悄悄加入新标记,需要重命名/删除。好吧,我想我们可以忍受它们,但我认为大多数人喜欢将其整洁化,并且当标记在SourceTree中被良好地结构化时更易于导航到旧标记。 - Carl Björknäs
找出如何在托管的存储库上设置规则,以防止推送与特定模式匹配的引用。我们曾经遇到过同样的问题,无论我们多少次解决它,只要有一个粗心大意的开发人员,所有标签就又会出现。最后,我上传了正确的标签列表,并防止人们将refs/tags/* 推送到我们的服务器,这最终使攻击停止了。 - Lasse V. Karlsen
@LasseV.Karlsen 目前在Team Services中无法设置所需的git钩子。 - Carl Björknäs
@LasseV.Karlsen,你知道吗,你所做的事情是否可以通过GitHub的Webhooks或者Actions来完成呢?谢谢! - Blademaster
1个回答

9
无论是git钩子还是其他脚本,它们都需要在本地机器上单独运行。因此,我建议在开发人员在本地机器上创建自己的标签之前,先将标签与远程同步。

实际上,每台本地机器只需要执行一次,因此开发人员只需要在开始工作之前在他们的机器上运行以下命令(删除本地标签并从远程获取所有标签):
git tag -l | xargs git tag -d
git fetch --tags

然后,开发人员可以在本地仓库上工作,甚至使用SourceTree中选定的“推送所有标记”选项进行git push,也不会影响您删除的旧标记。
此外,当将来VSTS可用服务器端挂钩时,您还可以使用post-push hooks检查删除的标记是否再次推送到远程。 如果是,则停止在post-push hook中指定的某些标记的推送。

是的,可悲的是这似乎是唯一的选择。我本以为我已经做到了这一点,但不知何故,一个开发人员仍然有旧标签,并将它们推送了出去...在团队服务拥有更多可用的git钩子之前,我将继续进行教育和管理。 - Carl Björknäs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接