You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

nginx+uWSGI环境下git-http-backend推送失败问题求助

我来帮你排查这个能克隆但没法推送的问题——毕竟克隆是读操作(GET请求),推送是写操作(POST请求),大概率是权限或者请求转发的配置没到位。咱们一步步来:

1. 先检查Nginx+uWSGI的请求转发配置

首先得确保POST请求能被正确传递到git-http-backend,而且关键的环境变量没配错。

Nginx配置要点

你的Nginx配置里必须允许POST请求,同时正确设置git-http-backend需要的环境变量,还要把请求转发给uWSGI:

location ~ ^/test.git(/.*)?$ {
    # 只允许GET/POST请求,其他直接拒绝
    limit_except GET POST {
        deny all;
    }

    # 设置git-http-backend的核心环境变量
    uwsgi_param GIT_HTTP_EXPORT_ALL "";
    # 替换成你的实际仓库根目录,比如/var/git/repos
    uwsgi_param GIT_PROJECT_ROOT /var/git/repos;
    uwsgi_param PATH_INFO $1;
    
    # 转发到uWSGI的socket路径
    uwsgi_pass unix:/path/to/your/uwsgi.sock;
    include uwsgi_params;
}

uWSGI配置要点

因为git-http-backend是CGI程序,你得在uWSGI配置里启用CGI支持,比如在你的uwsgi.ini里加这些:

[uwsgi]
socket = /path/to/your/uwsgi.sock
# 运行uWSGI的用户,要和仓库权限匹配,比如www-data
uid = www-data
gid = www-data
# 启用CGI模式,指向git-http-backend的实际路径(可通过which git-http-backend查询)
cgi = /usr/lib/git-core/git-http-backend
# 路由匹配你的仓库路径
route = ^/test.git(/.*)?$ cgi:/usr/lib/git-core/git-http-backend
2. 检查仓库的权限与类型

推送失败最常见的原因就是权限不够或者仓库类型不对:

  • 权限检查:确保uWSGI运行的用户(比如www-data)对仓库目录有写入权限:
    # 给用户赋予仓库目录的读写权限
    chown -R www-data:www-data /var/git/repos/test.git
    chmod -R g+w /var/git/repos/test.git
    
  • 仓库类型检查:非bare仓库默认禁止推送,你可以检查仓库是否为bare类型:
    cd /var/git/repos/test.git
    git config core.bare
    
    如果输出是false,要么把它转成bare仓库(推荐),要么修改配置允许非bare仓库推送(不推荐生产环境用):
    # 转成bare仓库的步骤(先备份原仓库)
    mv /var/git/repos/test.git /var/git/repos/test.git.backup
    git clone --bare /var/git/repos/test.git.backup /var/git/repos/test.git
    
3. 验证认证配置(如果需要)

如果你的仓库需要密码认证,得确保Nginx配置了HTTP认证,且POST请求也会经过认证:

location ~ ^/test.git(/.*)?$ {
    auth_basic "Git Repository Access";
    auth_basic_user_file /etc/nginx/.git-htpasswd;
    
    # 其他转发配置同上...
}

另外你的日志提到没找到example.com的.netrc记录,推送时如果弹出密码提示,要确认输入的用户名密码是有权限推送的账号。

4. 查看服务器端日志找细节

你的客户端日志只显示了连接过程,服务器端的日志能给出更直接的错误原因:

  • 查看Nginx错误日志:tail -f /var/log/nginx/error.log
  • 查看uWSGI错误日志:根据你配置里的logto路径,比如tail -f /var/log/uwsgi/git.log
    比如日志里如果出现permission denied,就是权限问题;如果出现no such file or directory,就是git-http-backend路径或者仓库根目录配置错误。

内容的提问来源于stack exchange,提问作者Psottek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:08:09