15.5 禁止非快进式推送
非快进式推送如果被滥用就会成为项目的灾难:
团队成员之间的提交战争取代了本应的相互协作。
造成不必要的冲突,为他人造成麻烦。
在提交历史中引入包含修补提交前后两个版本的怪异的合并提交。
Git提供了至少两种方式对非快进式推送进行限制。一个是通过版本库的配置,另一个是通过版本库的钩子脚本。
将版本库的配置变量receive.denyNonFastForwards设置为true可以禁止任何用户进行非快进式推送。下面的示例中,可以看到对一个已经预先设置为禁止非快进式推送的版本库执行非快进式推送操作,将会被禁止,即使使用强制推送操作也会被禁止。
(1)更改服务器版本库/path/to/repos/shared.git的配置变量。
$git—git-dir=/path/to/repos/shared.git config\
receive.denyNonFastForwards true
(2)在用户user1的工作区执行重置操作,以便在后面执行推送时产生非快进式推送。
$git reset—hard HEAD^1
$git log—graph—oneline
*b4f3ae0 user1's profile.
*5174bf3 initial commit.
(3)用户user1即便使用强制推送也不会成功。
在出错信息中看到服务器端拒绝执行:[remote rejected]。
$git push-f
Total 0(delta 0),reused 0(delta 0)
remote:error:denying non-fast-forward refs/heads/master(you should pull first)
To file:///path/to/repos/shared.git
![remote rejected]master->master(non-fast-forward)
error:failed to push some refs to 'file:///path/to/repos/shared.git'
另外一个方法是通过钩子脚本进行设置,可以仅对某些情况下的非快进式推送进行限制,而不是不分青红皂白地一概拒绝。例如:只对部分用户进行限制,而允许特定用户执行非快进式推送,或者允许某些分支可以进行强制提交而其他分支不可以。第5篇第30章会介绍Gitolite服务架设,通过授权文件(实际上通过版本库的update钩子脚本实现)对版本库非快进式推送做出更为精细的授权控制。