Ubuntu Apache搭Git服务 浏览器可访问但git命令报仓库未找到
问题根因
你的Git克隆失败核心是Apache虚拟主机配置存在3个致命错误,导致Git Smart HTTP协议根本没有被触发,浏览器能访问、弹认证只是因为请求被Apache当成静态文件处理了,完全没走到Git后端逻辑:
- 路径映射规则冲突且错误:你将Git HTTP后端(git-http-backend)的CGI入口挂载在了
/git/路径下,同时又写了一条Alias规则把/git/映射到静态仓库目录,但你实际访问的仓库地址是子域名根路径下的/Test.git,这类请求既不会走到CGI后端,还被静态文件规则拦截,Git客户端发的协议请求得不到正确响应自然报仓库不存在。本地文件路径克隆能成功是因为直接读磁盘文件,完全不走Web服务,和配置对错无关。 - 配置文件混入非法内容:
SetEnv GIT_PROJECT_ROOT这一行你不小心写进了HTML的<strong>标签,Apache解析时会把标签内容当成路径的一部分,直接导致后端找不到仓库根目录。 - 认证规则位置错误:你把认证逻辑写在每个仓库目录下的
.htaccess里,但CGI程序处理请求时不会读取仓库目录下的分布式配置文件,之前能弹出认证框只是静态文件请求命中了规则,真走到Git后端时认证逻辑不会生效。
修复步骤
- 先启用Apache必需的模块,Ubuntu默认不会自动开启Git HTTP依赖的模块,执行以下命令:
a2enmod cgi alias auth_basic authn_file authz_groupfile authz_user env - 修改虚拟主机配置文件
git.example.com.conf,替换为以下正确配置:<VirtualHost *:80> ServerName git.example.com ServerAdmin admin@example.com DocumentRoot /var/git/example.com # 修正Git后端环境变量,删掉非法HTML标签,去掉路径末尾多余斜杠 SetEnv GIT_PROJECT_ROOT /var/git/example.com SetEnv GIT_HTTP_EXPORT_ALL # 把CGI入口挂载到子域名根路径,匹配你直接访问/Test.git的URL规则 ScriptAlias / /usr/lib/git-core/git-http-backend/ # 删掉之前冲突的Alias /git/ 静态映射规则,避免抢请求 # Git后端CGI目录权限 <Directory /usr/lib/git-core> Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch AllowOverride None Require all granted </Directory> # 仓库根目录配置,把认证规则统一写在这里,不用每个仓库建.htaccess,支持后续动态加仓库 <Directory /var/git/example.com/> Options FollowSymLinks AllowOverride None AuthType Basic AuthName "Git Verification" AuthUserFile "/etc/apache2/git.example.com.htpasswd" AuthGroupFile "/etc/apache2/git.example.com.htgroup" <RequireAny> Require group admin <RequireAll> Require group user Require user my_name </RequireAll> </RequireAny> </Directory> # 可选:如果不想让浏览器直接访问看到目录列表,加这行返回404,和你之前Windows环境的效果一致 RedirectMatch 404 ^/$ ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> - 检查仓库目录权限,确保Apache运行用户(Ubuntu默认为
www-data)对仓库目录有读写权限(如果只需要拉取给读权限即可,要推送必须加写权限),不要用root权限创建仓库文件,避免权限不足。 - 验证配置文件语法无错后重启Apache:
apache2ctl configtest systemctl restart apache2 - 验证服务是否正常:执行
curl -I http://git.example.com/Test.git/info/refs?service=git-upload-pack,如果返回200状态码,且响应头包含Content-Type: application/x-git-upload-pack-advertisement,说明Git后端已经正常工作,此时再执行git clone http://git.example.com/Test.git即可正常克隆。
补充说明
你之前放在Test.git目录下的.htaccess文件可以直接删除,现在认证规则已经统一写在虚拟主机配置里,性能比分布式配置文件更好,新增仓库时直接在/var/git/example.com目录下创建裸仓库即可,不需要额外修改Apache配置,完全满足你动态新增仓库的需求。
内容的提问来源于stack exchange,提问作者matthewgreen
相关产品推荐
相关产品推荐

