我有几个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>
但它要求所有存储库的用户名和密码。我想只为几个存储库启用它。
答案 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
它可以分为几个部分:
公共前缀,包括存储库的名称:
/git/foo.git
这是直接在向Git讲述它时在存储库的URI中指定的内容,
喜欢做git clone http://user@server/git/foo.git
。
技术位,告诉服务器端Git你想从请求中得到什么:
/info/refs?service=git-receive-pack
此部分由客户端Git添加,您无法控制它。
指令中的.*
位匹配零个或多个任何字符,因此它显然匹配Git URI中的任何内容。
您需要优化此模式,以某种方式仅指向您希望应用推送限制的存储库。另请注意,如果您使用的是通用前缀(例如上面示例中的/git/
),则必须进行匹配。
现在是关于写一个正确的正则表达式。
一种方法是直接指定它们 - 使用所谓的改变 - 如
<LocationMatch "^/git/(repo1|repo2|repo3)/.*/git-receive-pack$">
而另一个是将所有需要保护的repos移动到一个公共目录下,例如priv
,并使用类似
<LocationMatch "^/git/priv/.*/git-receive-pack$">
后一种方法不需要更新Apache的配置并在添加需要经过身份验证的推送的另一个存储库时重新加载它:只需将其放在由/priv
前缀映射的目录中。
当然,该URI规范的确切部分取决于您的配置的其余部分(例如是否使用不等的^/git/
前缀)。