防止或捕获git历史记录重写的策略

Jac*_*cob 39 git

虽然我喜欢git history重写功能,但是如何确保历史记录不被重写.

我们不介意程序员在他们自己的机器上做什么,但我们需要确保不会将版本推送到更改历史记录的服务器.

即我们需要保证过去的特定版本真的是那个版本.因此,这将包括阻止某人通过并永久删除历史记录中的文件,或永久更改所有历史记录中的文件.

Von*_*onC 40

如果你可以运行:

 git config --system receive.denyNonFastforwards true
Run Code Online (Sandbox Code Playgroud)

在服务器上,应该注意重写历史案例被推送到所述服务器.
但是,这适用于所有repo,而不适用于特定文件或文件组.

git config:

receive.denyNonFastForwards

如果您重新提交已经推送的提交然后尝试再次推送,或者尝试将提交推送到不包含远程分支当前指向的提交的远程分支,那么您将被拒绝.这通常是好政策; 但是对于rebase,您可以确定您知道自己在做什么,并且可以使用-fpush命令强制更新远程分支.

另一种方法是通过服务器端接收挂钩,我稍后会介绍.这种方法可以让您执行更复杂的操作,例如拒绝非快速转发到特定的用户子集.


作为ebneter(谁知道连贯存储库的重要性 - 请参阅关于SVN到Git迁移的答案[问题现已删除,仅限10K +用户])评论:

您可能还想添加,receive.denyDeletes true因为否则,有人可以删除分支,然后将其重写的分支推送为新分支,从而有效地重写历史记录.

git config:

denyNonFastForwards策略的一个解决方法是让用户删除分支,然后使用新引用将其推回.在较新版本的Git(从1.6.1版开始)中,您可以设置receive.denyDeletes为true:

$ git config --system receive.denyDeletes true

这会通过全面推送来拒绝分支和标签删除 - 没有用户可以做到这一点.要删除远程分支,必须手动从服务器中删除ref文件.还有更有趣的方法可以通过ACL在每个用户的基础上执行此操作,您将在本章末尾学习.

  • 您可能还想添加receive.denyDeletes true,否则,有人可以删除分支,然后将其重写的分支作为新分支推送,从而有效地重写历史记录. (6认同)