搭建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授予仓库访问权限
- 将www-data加入git用户组:
usermod -aG git www-data
- 给仓库目录添加组读写权限:
chmod -R g+rw /git
- 设置目录setgid位,确保新文件继承组权限:
find /git -type d -exec chmod g+s {} \;
方法二:让fcgiwrap以git用户运行
如果不想让www-data拥有仓库权限,可修改fcgiwrap运行身份:
- 编辑fcgiwrap的systemd服务文件(路径通常为
/lib/systemd/system/fcgiwrap.service):
# 修改User和Group字段为git User=git Group=git
- 重新加载systemd配置并重启服务:
systemctl daemon-reload systemctl restart fcgiwrap
- 调整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
相关产品推荐
相关产品推荐

