在服务器上的主Git存储库旁边(使用Gitolite)我希望每个开发人员都可以设置一个镜像它自己的本地存储库。这并不难。
但是,我想在主Git服务器存储库上禁用git push --mirror
,以防止开发人员搞砸镜像时出错。我认为最好的地方是一个钩子,也许是更新钩子。但我找不到如何在服务器挂钩中检测到push --mirror
命令已在客户端计算机上执行。
客户端解决方案是不可能的,因为我们也使用Eclipse Git(JGit)。
答案 0 :(得分:2)
我不会试图通过使用钩子来“修补”安全性。它们不是为这种类型的访问控制而设计的。
你可以看看gitolite。它使您能够以分支前的方式控制访问。
答案 1 :(得分:2)
如果你真的想用钩子做这个,那么使用的钩子就是pre-receive
。您不能直接检测到它是镜像推送,因为没有任何关于发送的数据的说法,但是您可能很聪明,并且几乎一直都是正确的。预接收挂钩获取要更新的refs列表,包含旧值和新值,如果它以非零状态退出,则整个推送被中止。镜像推送的主要区别特征可能是它还按原样推动远程分支。我想不出你要做的任何正常情况,所以你可以检查一下,例如:
#!/bin/bash
while read old new ref; do
if [[ "$ref" =~ "^refs/remotes/.*" ]]; then
echo "You're pushing remote branches - did you use 'push --mirror'?"
echo "Rejecting push"
exit 1
fi
done
任何push --mirror
*会绊倒这个钩子,所以它应该覆盖你;它当然有点过于热心,但除非您打算在中央仓库中维护远程分支,否则无关紧要。
*除了非常真实的手动之外,有人通过手动指定git push --mirror <url>
从没有遥控器的仓库推送,但我真的希望你不必担心。
我仍然会推荐gitolite。它并不能完全让你否认镜像推动,但它可以有所帮助,并提供许多其他有用的东西。请注意,gitolite确实允许你添加自己的钩子,所以想要使用它不应该阻止你获得所有的gitolite善良。如果你不打算使用Gitolite,你应该真的,真的在中央仓库中将core.logAllRefUpdates
设置为true,这样如果有人确实被你推了,你可以恢复。
与gitolite为你做的这个问题有关的事情:
RW
,而不是RW+
权限),因此他们可以做的损害是有限的 - 删除分支可能是push --mirror