Git Authenticated推送apache

时间:2014-10-15 10:57:29

标签: git apache

我有几个Git存储库。所有这些都可以通过apache服务器访问,并且所有人都可以访问R / W。但是某些存储库应该具有经过身份验证的推送。我做过类似的事情

<LocationMatch "^/.*/git-receive-pack$">
    AuthType Basic
    AuthName "Git Access"
    AuthBasicProvider file
    # Password file created with htpasswd
    AuthUserFile /sample/password
    Require valid-user
</LocationMatch>

但它要求所有存储库的用户名和密码。我想只为几个存储库启用它。

1 个答案:

答案 0 :(得分:0)

一些背景

这个想法是,当通过HTTP [S]推送时,Git执行这样的请求

http://user@server/git/foo.git/info/refs?service=git-receive-pack

<Location><LocationMatch>指令在匹配时考虑的此部分URI

/git/foo.git/info/refs?service=git-receive-pack

它可以分为几个部分:

  1. 公共前缀,包括存储库的名称:

    /git/foo.git
    

    这是直接在向Git讲述它时在存储库的URI中指定的内容, 喜欢做git clone http://user@server/git/foo.git

  2. 技术位,告诉服务器端Git你想从请求中得到什么:

    /info/refs?service=git-receive-pack
    

    此部分由客户端Git添加,您无法控制它。

  3. 如何解决手头的问题

    指令中的.*位匹配零个或多个任何字符,因此它显然匹配Git URI中的任何内容。

    您需要优化此模式,以某种方式仅指向您希望应用推送限制的存储库。另请注意,如果您使用的是通用前缀(例如上面示例中的/git/),则必须进行匹配。

    现在是关于写一个正确的正则表达式。

    一种方法是直接指定它们 - 使用所谓的改变 - 如

    <LocationMatch "^/git/(repo1|repo2|repo3)/.*/git-receive-pack$">
    

    而另一个是将所有需要保护的repos移动到一个公共目录下,例如priv,并使用类似

    的内容
    <LocationMatch "^/git/priv/.*/git-receive-pack$">
    

    后一种方法不需要更新Apache的配置并在添加需要经过身份验证的推送的另一个存储库时重新加载它:只需将其放在由/priv前缀映射的目录中。

    当然,该URI规范的确切部分取决于您的配置的其余部分(例如是否使用不等的^/git/前缀)。