Git如何防止本地修改公共提交

时间:2015-04-02 09:37:36

标签: git git-rewrite-history

我已经在我的git central repo服务器上添加了receive.denyNonFastforwards和receive.denyDeletes。现在我想阻止本地历史修改,如果提交已被推送到中央仓库(就像默认情况下mercurial一样),我想我可以使用钩子,但我找不到任何例子。

这是一个奇怪的配置吗?

这听起来像是一个基本的保护措施,任何使用git的人都应该已经激活,并且我对缺少示例挂钩感到非常惊讶。

3 个答案:

答案 0 :(得分:3)

您可以使用Client-Side Hooks来阻止修改本地历史记录,就像使用Server-Side Hooks一样。

Here是客户端钩子代码的一些示例。在该页面的末尾附近是一个pre-rebase脚本,它可以处理您正在寻找的内容。

请注意,无法将客户端挂钩添加到存储库中,以便在下游存储库中自动设置它们:

  

因为钩子不是通过项目的克隆传输的,所以必须以其他方式分发这些脚本,然后让用户将它们复制到.git / hooks目录并使它们可执行。您可以在项目中或在单独的项目中分发这些钩子,但Git不会自动设置它们。

答案 1 :(得分:0)

Mercurial提供了一些处理可变chagenset的方法(可以重新排序/重写的更改集)。例如ChangeSet Evolution plugin

服务器端使用git的可能性更大(您可以使用问题中提到的两个配置拒绝push --force

您无法在客户端轻松强制执行挂钩,因为它需要激活,并且可以使用git commit --no-verify绕过。

但在Git 1.8.5之前,有一个pre-rebase client hook called

在Git 1.8.5之后,您可以作为客户a git push --force-with-lease

  

你假设你在决定重新定义历史应该是什么时接受了ref的租约,而只有在租约没有被破坏时才能退回

这允许客户端的一些自由,以及在服务器端更安全的强制推送。

答案 2 :(得分:0)

这看起来非常接近,如果不是与防止或捕获Git历史重写战略相同的问题

总结一下,你可以启用

  

git config --system receive.denyNonFastforwards true

  

git config --system receive.denyDeletes true

或者写一个帖子接收挂钩来拒绝你确定的任何重写