设置对git repo的只读http访问

时间:2013-09-07 12:59:43

标签: git nginx

如何才能通过http 访问远程git仓库,但仅用于克隆? 也许在nginx(已经运行)和git-http-backendgit-http-fetch?)的帮助下。

3 个答案:

答案 0 :(得分:4)

也许这就是您要找的git daemonGit serve: I would like it that simple

该页面上有许多有趣的答案,但没有专门针对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 command已经是只读的。所以它应该做它的工作。

我希望这有帮助!

答案 1 :(得分:4)

在他的answerJakub Narębski建议:

  

对于" smart" HTTP遵循匿名读取访问的指示,但是   git-http-backend联机帮助页中经过身份验证的写访问,进行翻译   从Apache到nginx,稍微修改。

根据他的建议,我使用git-http-backendif的组合配置了nginx和$arg以启用匿名读取访问权限但经过身份验证的写入权限 rewrite在调用git-http-backend之前区分Git读取和写入操作:

# /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指令,为fastcgi调用git-http-backend准备环境:

# /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;

答案 2 :(得分:3)

注意:我认为您的意思是匿名只读访问;我认为没有办法区分git中的clone和fetch。


您想设置“智能”HTTP(推荐)或“哑”HTTP吗?

对于“哑”的HTTP来说,禁止(或者只是不设置)WebDAV就足够了 - 这就是推送“哑”的HTTP(服务器端没有git)。

对于“智能”HTTP,请遵循git-http-backend联机帮助页中匿名读取访问权限但经过身份验证的写入权限的指示,将其从Apache转换为nginx,并稍加修改。请注意,匿名读取但经过身份验证的写入文档可能不完整,但您不必担心真正的写入(推送)访问成功,不是吗?