2012-02-09 48 views
2

旁边的一个服务器上的主要Git存储库(与Gitolite)我想有一个可能性为每个开发人员建立一个镜像它自己的本地存储库。这并不难。Git挂钩检测推 - 镜像

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

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

+0

http:// stackoverflow。com/questions/5264968/making-git-push-respect-permissions – sehe 2012-02-09 13:49:50

+0

我想保留对主要回购,拉,推,删除的所有访问权限。只需禁用推 - 镜像。 AFAIK文件系统访问对此没有帮助。 – xmedeko 2012-02-09 13:59:18

回答

1

如果你真的想用钩子要做到这一点,使用挂钩,将pre-receive。你不能直接检测到它是镜像推送,因为没有任何关于发送数据的内容,但你可以很聪明并且几乎可以随时获得它。预接收钩子获取要更新的参数列表,包括旧值和新值,如果它以非零状态退出,则整个推送被中止。镜像推送的主要特点可能是它也按照原样推送远程分支。我想不出任何正常情况下,你会做这样的,所以你可以只检查是否存在,是这样的:

#!/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+权限) ,所以他们可以做的损害是有限的 - 删除分支可能是更严格的日志访问的最差部分,因此如果有人确实会造成破坏,您可以确切地看到他们是谁以及他们做了什么,以及在将来避免它
+0

工作得很好,非常感谢。消息中应该有正常的撇号:''你在推远程分支机构 - 你使用'push --mirror'吗?“ – xmedeko 2012-02-10 08:40:55

+0

@xmdeko哎呀!标记混合,感谢您的支持。 – Cascabel 2012-02-10 16:26:05

2

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

你可以看看gitolite。它使您能够在分支机构的基础上控制访问。

https://github.com/sitaramc/gitolite/wiki

+0

感谢您的回复。当我在客户端上push -mirror时,比gitolite收到的命令是“git-receive-pack”,“git-upload-pack”,就像正常的读取和推送一样。所以我不知道如何检测push -mirror镜像。 – xmedeko 2012-02-09 14:11:13

+0

好吧,也许这是不可能的。我将不得不继续push - 镜像,并制作一些好的备份脚本。谢谢回复。如果没有其他答复会出现,我会将您标记为已接受。 – xmedeko 2012-02-09 14:13:22