MeteorCat / GitWeb+Nginx搭建微型代码库

Created Fri, 29 Sep 2023 01:19:57 +0800 Modified Wed, 29 Oct 2025 23:24:53 +0800
559 Words

GitWeb+Nginx搭建微型代码库

安装组件:

# 安装 nginx+扩展功能
sudo apt install nginx nginx-extras

# 安装 git/gitweb/fcgi
sudo apt install git gitweb fcgiwrap

默认创建 git 用户, 所有功能基于 git 用户操作

创建项目信息和权限:

# 设置全局用户/邮箱
git config --global user.name 'MeteorCat'
git config --global user.email '[email protected]'

# 加入权限组, 把 nginx 默认组追加到 git
sudo usermod -a -G git www-data

# 创建代码仓库目录, 这里创建根目录
sudo mkdir /projects
sudo chown -R git:git /projects

# 部署配置, 用于测试
cd /projects
sudo -u git git init --bare mix-game.git

# 创建 http 设置支持
cd mix-game.git
sudo -u git git config --file config http.receivepack true

修改 GitWeb 配置内容:

# 安装之后会追加该配置文件
sudo vim /etc/gitweb.conf

# 内部内容基本上只需要单个配置
## path to git projects (<project>.git)
## $projectroot = "/projects";

启用 fcgiwrap, 让其启动并设置开机启动:

sudo systemctl restart fcgiwrap.service
sudo systemctl enable fcgiwrap.service

配置 Nginx 服务文件( /etc/nginx/conf.d/gitweb.conf ), 内容如下:

server {
    listen  11111;
    server_name _;

    # 默认静态文件
    location ~* ^.+\.(css|js|png|jpg|jpeg)$ {
        root  /usr/share/gitweb;
        access_log   off;
        expires      24h;
    }

    # 挂起GitWeb服务
    location / {
        root /var/www;
        fastcgi_param SCRIPT_FILENAME /usr/share/gitweb/gitweb.cgi;
        fastcgi_pass unix:/var/run/fcgiwrap.socket;
        include /etc/nginx/fastcgi_params;
    }

    # 静态文件展示 
    location ~ ^.*\.git/objects/([0-9a-f]+/[0-9a-f]+|pack/pack-[0-9a-f]+.(pack|idx))$ {
        root /projects;
    }

    # 转发 git-http-backend, 内部转发到 gitweb.cgi 对象
    location ~ ^.*\.git/(HEAD|info/refs|objects/info/.*|git-(upload|receive)-pack)$ {
        
        # 代码仓库目录
        root /projects;

        # 引入默认 fastcgi 变量
        include /etc/nginx/fastcgi_params;

        # 通知调用 git-http-backend
        fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend; 

        # 如果不设置该参数, 则仅能访问明确标记为导出的git目录. 默认可以访问任何git目录
        fastcgi_param GIT_HTTP_EXPORT_ALL "";

        # 表示git仓库的地址, 这里直接设置 `root` 目录
        fastcgi_param GIT_PROJECT_ROOT $document_root;

        # 表示请求的用户
        fastcgi_param REMOTE_USER $remote_user;

        # 表示请求的git路径
        fastcgi_param PATH_INFO $uri;

        # 转发给管道通讯
        fastcgi_pass unix:/var/run/fcgiwrap.socket;
    }
}

之后访问局域网就能看到挂起的服务对象:

image

如果想拉取代码直接常规 clone 即可:

# 拉取代码, 这里没有设置安全加密提交代码也不需要账号密码, 公网切勿这样处理
git clone http://192.168.1.111:11111/mix-game.git

image