自建Git服务器(git-http-backend)裸仓库推送后无法克隆求助
我之前也碰到过一模一样的情况,用git-http-backend搭的裸仓库,首次推送后再克隆就报fatal: The remote end hung up unexpectedly,折腾了好一阵才搞定,给你几个最有效的排查和修复方向:
1. 修复仓库目录的权限问题
首次推送后,Git会在裸仓库里生成objects、refs等子目录和文件,这些文件的所有者可能是你执行推送的用户,而不是web服务器运行的用户(比如www-data、apache),导致git-http-backend没有权限读取这些内容。
执行以下命令修正权限(替换成你的web服务器用户和仓库实际路径):
# 递归设置仓库目录的所有者为web服务器用户 chown -R www-data:www-data /path/to/repoName.git # 确保目录和文件有合理的权限 chmod -R 755 /path/to/repoName.git
2. 确保web服务器配置中添加了GIT_HTTP_EXPORT_ALL环境变量
这是最容易被忽略的点!git-http-backend默认只允许授权用户访问非空仓库,而空仓库是开放的。如果没有设置GIT_HTTP_EXPORT_ALL,首次推送后仓库变成非空,就会拒绝未授权的克隆请求。
如果你用Apache:
在你的虚拟主机配置或.htaccess里添加:
SetEnv GIT_PROJECT_ROOT /path/to/your/repositories-root SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
(注意GIT_PROJECT_ROOT要指向所有git仓库的父目录,不是单个仓库)
如果你用Nginx:
在fastcgi配置块里添加对应的参数:
location /git/ { fastcgi_pass unix:/run/php-fpm.sock; # 根据你的web服务器配置调整 fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend; fastcgi_param GIT_PROJECT_ROOT /path/to/your/repositories-root; fastcgi_param GIT_HTTP_EXPORT_ALL ""; fastcgi_param PATH_INFO $uri; include fastcgi_params; }
3. 查看web服务器错误日志定位具体问题
如果上面两步都没解决,直接看web服务器的错误日志,里面会有更详细的报错信息,比如权限不足、git-http-backend路径错误等。
- Apache日志通常在
/var/log/apache2/error.log,执行:tail -f /var/log/apache2/error.log - Nginx日志通常在
/var/log/nginx/error.log,执行:tail -f /var/log/nginx/error.log
比如如果日志里出现Permission denied,那就是权限问题没解决;如果出现No such file or directory,可能是git-http-backend的路径配置错了。
4. 验证git-http-backend的运行权限
手动切换到web服务器用户,尝试访问仓库,确认是否有权限操作:
# 切换到web服务器用户(不同系统可能略有不同) su - www-data -s /bin/bash # 进入仓库目录 cd /path/to/repoName.git # 执行git检查命令,看是否能正常读取仓库 git fsck
如果这个命令报错,那肯定是权限问题,回到第一步重新调整权限。
内容的提问来源于stack exchange,提问作者Psottek

