Git是否具有“安全模式”以防止重写历史记录?


11

当您对Git(和一般的DVCS)有点新鲜,并且开始探索历史记录的更改时,如果存储库仅是本地的,则可以放心,但是如果使用遥控器并尝试使用推动这种变化。

我期望的一个功能是启用“安全模式”的能力,这基本上会阻止我执行我不应该做的事情……那是什么意思?我的意思是对已经推向原点的事物进行历史重写。我无法精确定义它,但这将包括以下情况:

  • commit --amend 当HEAD已被推动时
  • rebase 非本地分支机构
  • reset 被推的分支

这些是可能导致下一次push失败的情况的示例(因为IIRC不会快速前进)。我偶然地做了一些,不得不在遥控器上重新创建分支。而且我仍然很幸运能够如此快地执行此操作,以至于没人能拉出我重写的历史记录。

我相信可以识别​​这种类型的更改,并根据需要阻止用户进行更改。也许有一个选择吗?

如果没有,您认为尝试创建它值得吗?您会尝试精确定义如何识别这种“危险的变化”吗?


在工作环境中,所做的重大更改会影响其他程序员,您可能应该更不愿执行这些操作,除非您确定它应该起作用。即使那样,您也应该确认之后没有问题。想象一下,几年前,我在一个由许多程序员组成的团队中,没有人会提交未编译的源代码!三个月后,我想将他枪杀。
Neil

可以在远程计算机上的挂钩中检测到这一点,然后拒绝更改,这似乎很合理。
Andrew T Finnell


我不明白你的问题。默认模式是安全的。除非您指定,否则不允许您推送--force
西蒙·托斯

我也想看类似的东西。基本上,我想为那些学习git的人提供一个更安全的版本,可能只是包装命令行并只公开一些基本知识:提交,拉取,推送,简单的东西。强制他们使用git来完成此页面上的所有操作:git-scm.com/book/en/Git-Tools-Rewriting-History Git已经比其他工具要难得多,因为它需要本地和远程仓库考虑-担心您可能会变基而不是回滚,这很令人恐惧。
克里斯·莫斯基尼

Answers:


5

这看起来与用于防止或捕获Git历史记录重写策略的问题非常接近,甚至是不同的问题

总结一下,您可以启用

git config --system receive.denyNonFastforwards true

git config --system receive.denyDeletes true

或编写帖子接收钩子以拒绝您确定为重写的任何内容。


1
我相信denyNonFastforwards是默认值(?),而denyDeletes不是。这两个很有用,但是我正在想象一个客户端解决方案,commit --amend如果我无法将其推送(因为HEAD已经被推送),它将阻止我进行操作。
科斯2012年

换句话说:除了允许使远程服务器保持一致的机制之外,我还希望允许克隆与远程服务器保持“一致”的机制。
科斯2012年

@Kos您也可以创建本地钩子
Andrew T

有没有一种方法来设置denyNonFastfowardstrue只在主分支?我希望我的主题分支可以重新设置基础并强制使用。
nnyby

2

否,因为这是git哲学的一部分,它可以为您提供全部功能并让您以所需的方式管理该功能。

如果您不遵循这种哲学,那么也许改用Mercurial是值得的,因为它们允许重写历史,但是以有限的方式,或者明确地说是不情愿的方式,使您觉得这不是一个好主意。


2
我犯错了。一种机制要求我在进行危险操作时明确确认,这种机制似乎适合“以我想要的方式管理自己的力量”。:-)(Also Git有时也会这样做。)
Kos

2

AFAIK,git解决这些问题的方法是,每当您请求这样的操作时,它将在本地执行,但是通知您您在做什么可能会带来不良后果。那时,您还没有推送任何内容,因此您可以查看本地存储库,并可以在推送之前撤消危险的更改。您确实必须注意git告诉您的内容,并且在修复此类错误时最好小心。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.