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

搭建HTTPS Git服务器遇Push错误:无法创建临时对象目录

搭建HTTPS Git服务器推送失败:unpacker error

我正尝试搭建自己的托管Git服务器,但配置HTTPS下的Git选项时遇到推送失败问题。已安装Nginx和FastCGI,相关配置文件如下:

/etc/nginx/nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
}

http {
        sendfile on;
        tcp_nopush on;
        types_hash_max_size 2048;
        server_tokens off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        gzip on;

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;

        server {
                listen 80;
                listen [::]:80;

                return 301 https://$host$request_uri;
        }
}

/etc/nginx/sites-available/default(已链接至sites-enabled)

server {
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;

        ssl_certificate /etc/letsencrypt/live/[redacted]/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/[redacted]/privkey.pem;

        root /var/www/html;
        server_name [redacted] www.[redacted];
}

/etc/nginx/sites-available/git(已链接至sites-enabled)

server {
        listen 443 ssl;
        listen [::]:443 ssl;

        ssl_certificate /etc/letsencrypt/live/[redacted]/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/[redacted]/privkey.pem;

    server_name git.[redacted];

    auth_basic "login";
    auth_basic_user_file "/var/www/html/git/.htpasswd";
    location ~ ^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {
        client_max_body_size 0;
        include /etc/nginx/fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
        fastcgi_param GIT_HTTP_EXPORT_ALL "";
        fastcgi_param GIT_PROJECT_ROOT /git;
        fastcgi_param REMOTE_USER $remote_user;
        fastcgi_param PATH_INFO $uri;
        fastcgi_pass  unix:/var/run/fcgiwrap.socket;
    }
}

推送时的错误信息

error: remote unpack failed: unable to create temporary object directory
To https://git.[redacted]/[repo]
! [remote rejected] main -> main (unpacker error)
error: failed to push some refs to https://git.[redacted]/[repo]

Git项目所在目录完全由git用户拥有,这会不会是问题所在?

已尝试的排查步骤

  • 多次重启Nginx和fcgiwrap服务
  • 调整Git站点和默认站点的Nginx配置
  • 重置auth_basic的用户信息
  • 修改仓库文件夹权限
  • 切换推送分支

问题原因及解决方案

错误提示unable to create temporary object directory本质是权限不足:Nginx以www-data用户运行,fcgiwrap默认也以www-data身份执行git-http-backend,但你的Git仓库属于git用户,导致进程无权限写入仓库目录。

方法一:给www-data授予仓库访问权限

  1. 将www-data加入git用户组:
usermod -aG git www-data
  1. 给仓库目录添加组读写权限:
chmod -R g+rw /git
  1. 设置目录setgid位,确保新文件继承组权限:
find /git -type d -exec chmod g+s {} \;

方法二:让fcgiwrap以git用户运行

如果不想让www-data拥有仓库权限,可修改fcgiwrap运行身份:

  1. 编辑fcgiwrap的systemd服务文件(路径通常为/lib/systemd/system/fcgiwrap.service):
# 修改User和Group字段为git
User=git
Group=git
  1. 重新加载systemd配置并重启服务:
systemctl daemon-reload
systemctl restart fcgiwrap
  1. 调整socket权限,允许Nginx访问:
chown git:www-data /var/run/fcgiwrap.socket
chmod 660 /var/run/fcgiwrap.socket

额外检查项

  • 确认/git目录下的仓库是裸仓库(托管服务器推荐用裸仓库,创建命令:git init --bare /git/[repo])
  • 查看Nginx错误日志/var/log/nginx/error.log,获取更详细的权限报错信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:05:18