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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:24:21