如何制作一个git存储库'只拉'

时间:2013-07-17 16:57:53

标签: git networking repository

我正在为多个开发人员在共享服务器上设置开发环境。我将拥有一个存储库,其中包含生产中使用的所有代码,还有许多其他存储库用于团队中不同成员的开发。我想要的是生产回购只是'拉动'。用户可以随时从中获取并在本地进行生产更改,但是需要由生产管理员处理,或者至少需要密码。类似的东西:

[user@machine /devroot/myrepo]$ git pull $PRODUCTION master
From <location>
*branch             master       ->  FETCH_HEAD
Already up-to-date 

[user@machine /devroot/myrepo]$ git push $PRODUCTION master
error: user `user` is not authorized for this action

或者

[user@machine /devroot/myrepo]$ git push $PRODUCTION master
HEAD @ `$PRODUCTION`-Please enter password:

我相信我可以使用文件权限执行此操作,但这并不是一个优雅的解决方案。 git有内置的东西吗?

6 个答案:

答案 0 :(得分:3)

如果您需要复杂的存储库访问控制,您可能需要查看Gerrit。它的主要重点是代码审查(完全值得拥有!),但它也将访问控制作为副作用。

否则,如果您只是想要一些非常简单的东西,那么文件权限是在一台机器上处理它的一种非常好的方法。只要用户无法写入包含存储库的目录中的文件,他们就无法推送到它。我根本没有看到任何不优雅的东西!

答案 1 :(得分:2)

您可以使用gitolitegitosis。然后,您可以创建可以拉动,推送每个分支,谁可以创建标签等的用户列表。

我比gitosis更了解gitolite。配置只是一个git存储库,文件的语法很简单。

答案 2 :(得分:1)

git本身不包含任何权限管理。

您可以在管理您的git存储库的软件中实现更高级别(如果您采用某种集中式方法,但我想大多数公司都希望如此)。所以gitolite(http://gitolite.com/gitolite/)或gitlab可以做到这一点(http://gitlab.org/)。

答案 3 :(得分:1)

更多'同意成年人'的解决方案是否会正常运作?

例如,在git中,您只设置了远程提取,并将远程推送保留为虚拟的不存在的URL,这样用户就不会意外地git push到它。

编辑:这与接受的内容类似in this question

答案 4 :(得分:0)

我同意@duskwuff。看看这个branching model。这将有助于您实现只有而不是 Gerrit

答案 5 :(得分:0)

一个简单的解决方案是用户配置文件/etc/profile.d/git_restrictions.sh:

function git() {
    if [[ "$@" == 'pull' ]] || [[ "$@" == 'status' ]] || [[ "$@" == 'help' ]]; then
        echo "git $@"
        command git $@
    else
        echo " Allowed GIT commands on this server are:"
        echo " - git pull"
        echo " - git help"
        echo " - git status"
    fi
}

然后,当您运行上面列出的内容以外的其他任何东西时,会发生这种情况:

 Allowed GIT commands on this server are:
 - git pull
 - git help
 - git status