如何防止已删除的标签重新推送到远程Git仓库?

6
我正在尝试防止同事再次将在git中删除的标记推送(因为它曾被错误地推送过)。
我知道如何在本地执行此操作,如何将其推送到远程,以及如何指导我的同事以正确的方式拉取以从他们的本地存储库中修剪已删除的标记。
问题是,只需一个同事不先修剪就进行推送,删除的标记就会回来,很快所有同事都会回到旧标记。
协调并确保每个人在精确的时刻以修剪pull是一场噩梦。
我怀疑我必须求助于钩子。有什么建议以自动化的方式解决这个问题,而不需要每个人在恰当的时间pull-with-prune?
有人建议这个问题有一个解决方案,但那个问题仅讨论了如何删除远程标记。我对Git挂钩不够熟悉,无法解决这个问题,所以希望提供如何使用Git挂钩解决该问题的指示。

1
@leopal 并不完全是这样。至少我编辑了标题,以防止人们误读问题。 - Acorn
1个回答

1

你可以使用钩子来解决这个问题,无论是客户端(因为你控制着同事的机器),还是服务器端(最好的方式)。其他答案可能会帮助你解决这个问题。

然而,关于避免这种情况的一些建议:正确处理这种情况的方法不是给公司中的每个人都赋予推送权限。即使你想要一个集中式的存储库,让每个人都在其中工作(这是一个坏主意),肯定也不应该让每个人都能够创建生产标签(这是一个非常糟糕的主意)。这只是一种反模式,会导致像这样的问题。

相反,最好的方法是有一个或几个开发人员/经理来审查和接受更改(通常称为拉取请求)。这样,你就确保错误不能简单地通过,并且至少进行了一定程度的审查。此外,你还可以有一个机器人在草稿阶段审查拉取请求,以查找这样的问题;而不是在最终合并阶段。对于管理拉取请求,可以使用一些知名的软件/平台或像Linux内核那样使用基于电子邮件的方法。

最后,还有一点:如果标签已经创建,并且这是一个公共存储库(或其他人可以访问的存储库,例如您的客户),您真的不应该删除它。与不删除已经公开推送的历史记录相同的原则。废弃旧标签并创建一个取代它的新标签是最好的方法。

3
我强烈反对你不授权的做法。这可能适用于某些公司和文化,但并不适用于我所处的世界。这也是完全不同的讨论。 - Nicolai Henriksen
需要删除该标签。它是错误创建的,提交已被另一个正确命名的标签引用。拥有那个旧标签会让人感到困惑。 - Nicolai Henriksen
@NicolaiHenriksen 我已经帮助过几个遵循这种“方法”的项目和公司,但它根本就是有问题的。如果你没有对主分支进行任何访问控制,那么它就像在CVS和SVN中一样有问题。它甚至无法扩展:尝试在一个拥有300多名开发人员的公司中执行此操作(或在CVS和SVN中执行相当的操作),你会看到问题所在。(...) - Acorn
将推送权限授予公司中每个员工的生产分支、标签等,总会出现问题(正如您自己的问题所证明的那样)。总是有替代方案的,特别是我们正在谈论 Git,它非常灵活。 - Acorn
关于标签:不,它不应该被删除。如果你犯了一个错误,然后你推送了它,而且你没有任何办法阻止它到达主仓库,正确的方法是接受它。想象一下你推送了敏感信息:没有办法把它隐藏回去。但是,如果你想要几乎原始的存储库,你需要有一种防止错误的方法;这就是我的答案所涉及的内容。 - Acorn

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