Git钩子来检测push --mirror

时间:2012-02-09 12:37:20

标签: git githooks gitolite

在服务器上的主Git存储库旁边(使用Gitolite)我希望每个开发人员都可以设置一个镜像它自己的本地存储库。这并不难。

但是,我想在主Git服务器存储库上禁用git push --mirror,以防止开发人员搞砸镜像时出错。我认为最好的地方是一个钩子,也许是更新钩子。但我找不到如何在服务器挂钩中检测到push --mirror命令已在客户端计算机上执行。

客户端解决方案是不可能的,因为我们也使用Eclipse Git(JGit)。

2 个答案:

答案 0 :(得分:2)

我不会试图通过使用钩子来“修补”安全性。它们不是为这种类型的访问控制而设计的。

你可以看看gitolite。它使您能够以分支前的方式控制访问。

请参阅https://github.com/sitaramc/gitolite/wiki

答案 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
  • 中最糟糕的部分
  • 日志访问权限更加充分,如果有人确实造成了损害,您可以确切地看到它是谁以及他们做了什么,并在将来避免它。