【问题标题】:Prevent "git push origin -prune"?防止“git push origin -prune”?
【发布时间】:2015-03-19 01:21:38
【问题描述】:

勉强避免了一场国际事件。我们的一位开发人员执行了git push origin --prune(而不是git fetch origin --prune!)

这导致远程存储库上的所有远程分支都被删除(当然,除了当前分支之外的所有分支)。

幸运的是,尚未获取另一个开发人员的克隆,因此我可以重新推送所有远程分支。

这对我来说似乎相当危险;有没有办法防止这种情况发生,或者至少让它更难做?

【问题讨论】:

  • 你总是可以从 reflog 中恢复所有分支的状态,所以看起来并不那么危险。实际的提交不会从对象存储中删除,只有指向头的指针。
  • @SvenMarnach - 是的,我知道只有指向头部的指针被移除。 reflog 似乎没有包含任何有用的信息。只是在我们的情况下并不危险,因为我可以从另一个克隆中恢复分支。
  • reflog 仅包含之前已提取到本地克隆的分支的信息。除非您指定非标准 refspec,否则这应该是所有这些。尝试例如git reflog remotes/origin/master 用于获取到本地克隆的某些分支。如果您实际上在服务器上有从未被提取到任何克隆的分支(如何?),您可能确实会丢失指向它们的头指针。

标签: git git-push


【解决方案1】:

这取决于您如何管理授权。 如果你确实使用gitolite,你只需要确保标准用户对存储库没有RW+权限。

access rules in gitolite 的语法表明,如果没有 RW+,用户将无法推送任何会删除存储库中任何内容的操作。

【讨论】:

    【解决方案2】:

    您可以在服务器端更改 update 挂钩。

    您可以在此处找到有关它的文档: http://git-scm.com/docs/githooks 在这里你可以找到更详细的例子: An Example Git Enforced Policy

    我认为你可以写一个钩子来拒绝多个被删除的分支。

    【讨论】:

    • 我不确定。我认为更新挂钩会为每个更新的 ref 调用一次 - 所以我认为远程永远不知道有多少 ref 被删除?
    • @SteveFolly:虽然update 钩子确实在每个引用中被调用一次,但pre-receive 钩子在更新完整的引用列表时被调用一次。
    • @SvenMarnach 如果你把它写成答案,我会接受它
    猜你喜欢
    • 2021-04-13
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 2015-12-08
    • 2017-09-21
    • 2020-07-30
    • 1970-01-01
    • 2023-02-02
    相关资源
    最近更新 更多