【问题标题】:Can git rebase completely remove remote history?git rebase 可以完全删除远程历史记录吗?
【发布时间】:2011-07-15 08:47:18
【问题描述】:

当我们考虑在工作中从 SVN 迁移到 git 时,一位同事提出了这样的担忧,即恶意或容易发生事故的开发人员可能会使用 git rebase 从我们的共享存储库中删除远程历史记录。

编辑:正如答案中所指出的,也可以使用git push origin :branch-name 从远程仓库中删除整个分支。

这是一个现实的问题吗?如果是这样,我们可以采取什么方法来防止它?

【问题讨论】:

  • @sehe 这并没有解决人为错误问题,并使 git 的采用成为一个组织问题和技术问题。
  • 你有什么要说的吗?采用 VCS 工作流程是一项组织挑战。另外,我觉得很有趣,你这样说接受一个回答说同样的建议使用 Gerrit 来调节推送访问......在 8 日八月
  • 我的意思是“你必须信任每个开发人员,或者有看门人,没有人永远不会犯错”对于我(同事)的问题并不是一个令人满意的答案.我接受了一个粗略的回答,假设这是唯一的解决方案,但几周后提出了一种不同的方法。我将尝试 config-parameters 方法,如果成功,那将是我的首选答案。

标签: git rebase git-rebase


【解决方案1】:

我倾向于同意您的同事的观点,即这里存在问题,因为:

  • 无论您多么信任您的提交者,总有可能出现人为错误
  • 更繁重的审核流程(例如 Gerrit)并不总是合适的
  • 从备份恢复可能会很慢,而且是 PITA

您是否考虑过receive.denyNonFastForwardsreceive.denyDeletes 配置参数? AFAICT 这些在 Git 1.6 及以后版本中可用。

来自 Pro Git:

如果你对已经推送的提交进行变基,然后尝试推送 再次,或者尝试将提交推送到远程分支 不包含远程分支当前指向的提交, 你会被拒绝。这通常是好的政策;但在 变基,你可以确定你知道你在做什么并且可以 使用-f 标志强制更新远程分支到您的推送命令。

禁用强制更新远程分支的功能 非快进引用,设置receive.denyNonFastForwards

另一种方法是通过服务器端接收钩子,我稍后会介绍。这种方法可以让您执行更复杂的事情,例如拒绝对特定用户子集进行非快进。

正如作者提到的,这条规则也可以通过接收钩子(即described later in Pro Git)来执行。

这些技术应该可以防止您的共享存储库中意外(或恶意)丢失历史记录。

【讨论】:

  • 这对我们来说是一个很好的解决方案——但我对接受它的完整性感到紧张。考虑到 git 有多少种不同的使用方式,可能仍然存在允许删除代码的漏洞。
  • 好的,我们已经实现了denyNonFastForwards,它工作正常:)
【解决方案2】:

使用rebase可以搞乱历史,但是通常远程repo不会接受修改历史的更改(除非你使用git push --force),但更重要的是,拥有push权限的开发者可以完全删除分支(git 推送来源:分支名称)。所以简单的规则是:

  • 不要将推送权限授予您不信任的开发者。

  • 当 repo 被共享时,不要弄乱历史,避免对过去的提交使用 rebase。如果您需要从不同的分支添加内容,请改用合并或樱桃挑选,在这种情况下,历史记录不会受到影响。

  • 1234563远程)并且应该在本地解决问题而不是强制推送。

关于您的问题如何防止 - 使用Gerrit 修订系统,它就像开发人员的本地存储库和主存储库之间提交的中间步骤,具有用于修订的漂亮 Web 界面,您可以授予推送权限任何人都可以修改版本库,但是在验证和批准后更改将合并到您的主分支中(这需要您通常授予核心开发人员的一些权限)。您可能会在 Mahara 项目中看到它的样子:https://reviews.mahara.org 在这种特殊情况下,仅允许 gerrit bot 推送到 master(即 here),其他任何人都不能。

【讨论】:

    【解决方案3】:

    Gerrit 等企业 Git 服务器的扩展可以检测历史记录重写和分支删除,并将它们备份到一个特殊的 ref 下,以便在需要时可以恢复它们,并且不会被垃圾收集修剪。如果出于法律原因需要,Gerrit 管理员仍然可以删除选定的提交。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-07
      • 2014-05-05
      • 2014-11-20
      • 2023-01-30
      • 2020-05-30
      • 2015-01-23
      • 1970-01-01
      • 2013-04-25
      相关资源
      最近更新 更多