设置对git repo的只读http访问权限

我怎么能有一个远程的git回购可以通过http访问, 但只克隆 ? 也许在nginx(已经运行)和git-http-backendgit-http-fetch ?)的帮助下。

注:我假设你的意思是匿名只读访问; 我想,无法区分clone和git中的获取。


你想设置“智能”HTTP(推荐),或“愚蠢的”HTTP?

对于“愚蠢的”HTTP是足够的,禁止(或只是不建立)WebDAV – 这是如何推来与“哑”HTTP(服务器端没有混帐)。

对于“聪明”的HTTP遵循匿名读取访问指示, 在git-http-backend联机帮助页中验证写入访问 ,将其从Apache转换为nginx,并略微修改。 请注意,匿名读取但认证写入的文档可能不完整,但是您不必担心无论如何都不能完成写入(推式)访问,不是吗?

也许这就是你正在寻找的git daemon : Git serve:我想这很简单

这个页面有很多有趣的答案,但没有专门针对nginx的。

然后你可以像下面这样在nginx中添加代理传递:

 location / { proxy_set_header Host $host; proxy_pass http://127.0.0.1:9418; # Port 9418 is the default git daemon port } 

我不知道只允许克隆的方法…但git daemon命令已经是只读的。 所以它应该做的工作。

我希望这有帮助 !

JakubNarębski在他的回答中提出:

对于“聪明”的HTTP遵循匿名读取访问指示, 在git-http-backend联机帮助页中验证写入访问 ,将其从Apache转换为nginx,并略微修改。

根据他的建议,我配置了nginx和git-http-backend来启用匿名读取访问,但通过结合使用if$argrewrite来区分Git读取和写入操作,然后调用git-http-backend验证写入访问

 # /etc/nginx/sites-available/git server { listen 80; server_name myhostname; access_log /var/log/nginx/git.access.log; error_log /var/log/nginx/git.error.log; gzip off; location ~ /git(/.*) { if ($arg_service = git-receive-pack) { rewrite /git(/.*) /git_write$1 last; } if ($uri ~ ^/git/.*/git-receive-pack$) { rewrite /git(/.*) /git_write$1 last; } if ($arg_service = git-upload-pack) { rewrite /git(/.*) /git_read$1 last; } if ($uri ~ ^/git/.*/git-upload-pack$) { rewrite /git(/.*) /git_read$1 last; } } location ~ /git_read(/.*) { include git-http-backend.conf; } location ~ /git_write(/.*) { auth_basic "Pushing to Git repositories is restricted"; auth_basic_user_file /etc/nginx/.htpasswd; include git-http-backend.conf; } } 

配置文件/etc/nginx/git-http-backend.conf包含了为fastcgi调用git-http-backend准备环境的常用fastcgi指令:

 # /etc/nginx/git-http-backend.conf fastcgi_pass unix:/var/run/fcgiwrap.socket; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend; fastcgi_param GIT_HTTP_EXPORT_ALL ""; fastcgi_param GIT_PROJECT_ROOT /data/git; fastcgi_param PATH_INFO $1; fastcgi_param REMOTE_USER $remote_user;