云计算百科
云计算领域专业知识百科平台

【Win10 部署私有 Git 服务器 (Gogs) 完全指南】

前言

在 Windows 环境下搭建私有的 Git 代码托管服务,Gogs 是一个轻量级且易于部署的优秀选择。本文将详细介绍如何在 Windows 10 上安装 Gogs、配置为系统服务、进行数据迁移以及解决常见的权限与推送错误。


一、环境准备与资源下载

在开始之前,请确保已准备好以下资源:

  • Gogs 安装包
    • 官网下载:https://dl.gogs.io/
    • GitHub 仓库:https://github.com/gogs/gogs
    • 官方安装文档:Install from Binary
  • NSSM (Non-Sucking Service Manager)
    • 用于将 Gogs 注册为 Windows 系统服务,实现开机自启。
    • 下载地址:https://nssm.cc/download
  • 参考教程
    • 若遇疑难,可参考知乎、CSDN 或博客园的相关部署文章(如“Windows下如何搭建属于自己的git服务器”)。

  • 二、Gogs 安装与配置

    1. 解压与目录规划

    建议规划统一的工具目录,例如 D:\\tools。

    • 将下载的 gogs_0.13.0_windows_amd64.zip 解压至 D:\\tools\\gogs。
    • 将 NSSM 解压至 D:\\tools\\nssm-2.24\\win64。

    2. 配置环境变量

    为了方便命令行调用,建议将 NSSM 的路径加入系统环境变量 Path 中:

    • 添加路径:D:\\tools\\nssm-2.24\\win64

    3. 注册为系统服务

    为了让 Gogs 在后台稳定运行并随系统启动,需将其注册为服务。

  • 以管理员身份打开命令提示符(CMD)或 PowerShell。

  • 进入 Gogs 的脚本目录:

    cd D:\\tools\\gogs\\scripts\\windows

  • 执行安装脚本:

    install-as-service.bat

    注:此脚本通常会自动调用 NSSM 进行服务注册。如果脚本执行失败,也可手动使用 nssm install gogs 命令进行图形化配置。

  • 验证服务:打开 Windows“服务”管理器,查找名为 gogs 的服务,确保其状态为“正在运行”。

  • 4. 初始化安装

  • 浏览器访问默认地址:http://127.0.0.1:3000/install
  • 数据库设置:初次安装可选择内置数据库(SQLite3)或连接外部数据库(MySQL/PostgreSQL)。
  • 应用设置:
    • 基础 URL:根据实际访问 IP 修改(如 http://192.168.1.100:3000/)。
    • SSH 端口:默认是 22。如果 Windows 已开启 OpenSSH 服务,建议修改为其他端口(如 2222)以避免冲突。
  • 点击“立即安装”。
  • 5. 防火墙配置

    若需局域网内其他机器访问,需在 Windows 防火墙中放行对应端口:

    • HTTP 端口:默认 3000(若修改过请以实际为准)。
    • SSH 端口:默认 22 或自定义的 2222。

    注意:如果修改了配置文件中的端口号,必须重启 Gogs 服务才能生效。 重启命令(管理员权限):

    net stop gogs
    net start gogs

    或者在“服务”管理器中右键重启。


    三、数据迁移方案

    当需要更换服务器或重装系统时,数据迁移是关键步骤。

    1. 迁移方法对比

    • 官方备份命令(推荐但需注意版本兼容性):.\\gogs backup # Windows
      ./gogs backup # Linux
      # 排除仓库文件(仅备份配置和数据库)
      .\\gogs backup –exclude-repos
      # 指定配置文件
      .\\gogs backup –config=my/custom/conf/app.ini
    • 直接拷贝法(本文采用): 直接复制整个 gogs 安装目录(包含 conf, data, log 等)以及 gogs-repositories 仓库目录到新机器覆盖。

    2. 迁移后的常见问题与修复

    直接拷贝数据后,常因文件所有者或数据库用户ID不匹配导致权限错误(如页面显示 500 错误,或无法推送代码)。

    现象描述

    登录新服务器后,发现原有仓库的拥有者显示异常,或者新建仓库的拥有者是当前登录的管理员账号,而非原始数据的归属者。

    解决方案:修正数据库所有权

    需要通过直接操作 Gogs 的数据库(通常是 gogs.db SQLite 文件或 MySQL 数据库)来修正 owner_id。

    步骤演示:

  • 确认用户 ID: 登录 Gogs 网页,查看目标用户的个人主页 URL,或直接查询数据库 user 表。 假设目标用户 rady 的 ID 为 1,新用户 yf 的 ID 为 2。

  • 修正仓库所有者 (repository 表): 将特定仓库的所有者 ID 修改为正确的用户 ID。

    — 示例:将名为 'demo' 的仓库所有者设为 ID 为 1 的用户
    UPDATE "repository"
    SET "owner_id" = 1,
    "lower_name" = 'demo',
    "name" = 'demo',
    "description" = 'demo测试',
    "is_bare" = 0
    WHERE "lower_name" = 'demo';

  • 修正关注关系 (watch 表): 确保关注记录的用户 ID 与仓库所有者一致。

    UPDATE "watch"
    SET "user_id" = 1
    WHERE "repo_id" = (SELECT "id" FROM "repository" WHERE "lower_name" = 'demo');

  • 修正动态记录 (action 表): 修复时间线和动态反馈中的用户引用。

    UPDATE "action"
    SET "user_id" = 1, "repo_user_name" = 'rady'
    WHERE "repo_id" = (SELECT "id" FROM "repository" WHERE "lower_name" = 'demo');

  • 批量修复脚本示例: 如果有多个仓库需要迁移给新用户(例如用户 ID 7,用户名 op):

    — 修改仓库所有者
    UPDATE "repository" SET owner_id = 7 WHERE lower_name = 'bat-samples';

    — 修改关注记录
    UPDATE "watch" SET user_id = 7
    WHERE repo_id = (SELECT id FROM "repository" WHERE lower_name = 'bat-samples');

    — 修改动态记录
    UPDATE "action" SET user_id = 7, repo_user_name = 'op'
    WHERE repo_id = (SELECT id FROM "repository" WHERE lower_name = 'bat-samples');

  • 添加协作者权限: 如果需要给用户赋予特定仓库的写入权限,需同时在 access 和 collaboration 表中插入记录。

    — 模式 2 代表写权限 (Write),模式 1 代表读权限 (Read)
    INSERT INTO "access" ("user_id", "repo_id", "mode") VALUES (2, 579, 2);
    INSERT INTO "collaboration" ("user_id", "repo_id", "mode") VALUES (2, 579, 2);


  • 四、常见故障排查

    问题:Git 推送失败 (Error 403 / Unexpected Disconnect)

    报错信息示例:

    Compressing objects: 100% (34759/34759), done.
    error: RPC failed; HTTP 403 curl 22 The requested URL returned error: 403
    send-pack: unexpected disconnect while reading sideband packet
    Writing objects: 100% (46516/46516), 2.38 GiB | 304.78 MiB/s, done.
    fatal: the remote end hung up unexpectedly

    可能原因及解决方法:

  • 权限不足 (HTTP 403)

    • 原因:当前使用的 Git 账号没有该仓库的写入权限,或者密码/Token 认证失败。
    • 解决:
      • 检查 Gogs 网页端该用户是否有仓库的“写”权限。
      • 如果是 HTTPS 推送,尝试重新输入密码或使用 Personal Access Token。
      • 检查是否开启了双重验证(2FA),若开启必须使用 Token 而非密码。
  • 推送包过大导致超时

    • 原因:一次性推送的文件过多或单个文件过大,导致 Nginx/IIS/Gogs 内部超时限制。
    • 解决:
      • 分批提交:不要一次性推送大量历史提交,尝试分多次推送。
      • 调整配置:修改 Gogs 的 app.ini 配置文件,增加上传限制和超时时间。

      [server]
      MAX_UPLOAD_SIZE = 1024 ; 单位 MB

      [repository]
      DISABLE_HTTP_GIT = false

      • 检查 Web 服务器:如果前端使用了 Nginx 反向代理,需同步调整 client_max_body_size。
  • SSH 密钥问题

    • 原因:如果使用 SSH 协议推送,本地公钥未正确添加到 Gogs 账户设置中。
    • 解决:
      • 在 Gogs 网页端 -> 设置 -> SSH/GPG 密钥,添加本地的 id_rsa.pub 内容。
      • 确保本地 SSH 客户端使用的是正确的私钥(可通过 ssh -T git@your-server-ip -p 2222 测试连接)。

  • 五、总结

    在 Windows 上部署 Gogs 是一种低成本构建私有代码库的有效方式。通过 NSSM 将其服务化可以保证稳定性,而在进行数据迁移时,理解底层的数据库结构(特别是 user, repository, access 表之间的关系)对于解决权限错乱问题至关重要。遇到推送错误时,优先排查权限配置和网络超时设置。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 【Win10 部署私有 Git 服务器 (Gogs) 完全指南】
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!