📋 项目背景

原有痛点

我们之前使用 SVN 管理测试程序的变更记录,但在实际使用中遇到了一个严重的局限性:

SVN 无法处理 2GB 以上的大文件

随着测试程序和镜像文件的体积不断增长(testtool、testimage、ATOtools、Shippingimage、BIOS 等),这个限制严重影响了我们的工作效率。

解决方案

引入 自建 Git 服务器 + LFS(Large File Storage) 功能,实现:

  • ✅ 支持大文件版本控制
  • ✅ 完整的代码历史记录
  • ✅ 自动化导出和通知
  • ✅ 权限管理和审计

🔍 工具选型对比

在自建 Git 服务器的方案选择上,我们对比了主流的四款工具:

四款工具详细对比

工具 语言/架构 核心特点 适用场景
Gogs Go(单二进制) 极轻量、资源占用极低、安装简单;功能基础(代码托管、权限管理、Web Hook) 超小型团队或个人开发者
Gitblit Java 轻量、支持图形化界面、适合 Windows 部署;功能简单(仓库管理、基础权限) 需要简单界面操作的小团队
Gitea Go(Gogs 分支) 轻量但功能更全面(CI/CD、代码审查、项目管理、制品库);社区活跃,更新频繁 需要轻量但功能较全的团队
GitLab Ruby 功能全面(全周期 DevOps、CI/CD、看板、Wiki);资源消耗高,配置复杂 中大型团队或复杂项目

各工具详细分析

Gitblit

优点:

  • 基于 Java 开发,适合 Java 开发者
  • 界面友好,Windows 环境下部署方便

缺点:

  • 功能相对简单
  • 主要提供代码仓库管理和基础权限控制
  • 对高级功能支持不足
  • 社区不如 Gitea 活跃

Gitea

优点:

  • 基于 Go 语言开发,轻量级
  • 跨平台,安装和升级方便
  • 功能全面:CI/CD、代码审查、项目管理、制品库等
  • 社区活跃,更新频繁

缺点:

  • 相对 Gogs,资源占用略高
  • 但在同类产品中仍然算轻量级

Gogs

优点:

  • 非常轻量级,资源占用极低
  • 安装简单,部署方便
  • 核心功能完善
  • 适合对服务器资源有严格要求的场景

缺点:

  • 功能相对 Gitea 较少
  • 社区活跃度不如 Gitea

🏆 最终选择:Gitea

选择理由:

  1. 功能与轻量化的最佳平衡
  2. 支持 LFS,完美解决大文件问题
  3. 社区活跃,持续更新和维护
  4. 跨平台,支持 Windows/Linux
  5. 安装简单,单二进制文件即可运行

Gitea 是 Gogs 的分支,在保持轻量级的同时,增加了更多实用功能。


🚀 安装和配置

安装步骤

参考教程:

简要步骤:

  1. 下载安装 Gitea

    1
    2
    
    # 下载 Windows 版本
    wget https://dl.gitea.com/gitea/1.21.0/gitea-1.21.0-windows-4.0-amd64.exe
    
  2. 创建配置文件

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    
    ; app.ini
    [server]
    DOMAIN = git.yourcompany.com
    HTTP_PORT = 3000
    ROOT_URL = http://git.yourcompany.com:3000/
    
    [database]
    DB_TYPE = sqlite3
    PATH = data/gitea.db
    
    [repository]
    ROOT = data/git-data/repositories
    
    [lfs]
    START_SERVER = true
    PATH = data/lfs
    
  3. 配置 Windows 服务

    1
    2
    3
    4
    
    nssm install Gitea
    nssm set Gitea Application "C:\Gitea\gitea.exe"
    nssm set Gitea AppDirectory "C:\Gitea"
    nssm start Gitea
    
  4. 初始化配置

    • 访问 http://localhost:3000
    • 设置管理员账号
    • 配置仓库根目录
    • 启用 LFS 支持

📦 LFS 大文件支持

问题:仓库更新特别慢

问题描述: 在使用过程中,发现更新仓库特别慢,尤其是包含大文件(.zip、.7z 等)的仓库。

原因分析:

  • Git 默认会下载所有历史版本的文件
  • 大文件的历史版本会占用大量带宽和存储空间

解决方案:启用 LFS 功能

步骤 1:配置 LFS 跟踪文件类型

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
cd my-repository

# 跟踪特定文件类型
git lfs track "*.zip"
git lfs track "*.7z"
git lfs track "*.iso"
git lfs track "*.vmdk"

# 提交配置
git add .gitattributes
git commit -m "enable LFS support"
git push origin main

步骤 2:迁移已有大文件到 LFS

1
2
3
4
5
# 迁移仓库中所有历史提交的 7z 和 zip 文件到 LFS
git lfs migrate import --include="*.7z,*.zip" --everything

# 强制推送(注意:会重写历史)
git push --force-with-lease origin main

⚠️ 注意:如果使用 TortoiseGit 工具,请在 push 时勾选 “force-with-lease” 选项

步骤 3:验证 LFS 状态

1
2
3
4
5
# 查看 LFS 跟踪的文件
git lfs ls-files

# 查看 LFS 状态
git lfs status

LFS 工作原理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
普通 Git 仓库:
┌─────────────────┐
│  .git/objects/  │ ← 存储所有文件内容
│  file.zip (1GB) │ ← 占用大量空间
│  file.zip (1GB) │ ← 每个版本都存储
└─────────────────┘

Git LFS 仓库:
┌─────────────────┐      ┌─────────────────┐
│  .git/objects/  │      │  .git/lfs/      │
│  pointer file   │─────►│  file.zip (1GB) │
│  (几 KB)        │      │  只存储最新版本 │
└─────────────────┘      └─────────────────┘

🔄 自动化流程设计

整体流程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
flowchart TB
    %% 工程师模块
    subgraph EngModule["👨‍💻 工程师操作模块"]
        direction TB
        A[工程师]:::engineer
        A1[使用 TortoiseGit<br/>修改提交代码]:::engAction
        A2[下载和查询<br/>历史记录]:::engAction
        A3[申请 Git 仓库<br/>修改权限]:::engAction
        
        A --> A1
        A --> A2
        A --> A3
    end
    
    %% 管理员模块
    subgraph AdminModule["🛠️ 管理员管理模块"]
        direction TB
        F[管理员]:::admin
        F1[保留登录<br/>维护权限]:::adminAction
        F2[维护 Git 仓库]:::adminAction
        
        F --> F1
        F --> F2
    end
    
    %% 系统自动化模块
    subgraph SystemModule["⚙️ 系统自动化模块"]
        direction TB
        B[Git 仓库]:::system
        C[服务器]:::system
        D[研发/NPI/TE]:::system
        G[产线机台]:::system
        
        B -->|自动导出| C
        B -->|发送邮件通知| D
        C -->|获取最新程序| G
    end
    
    %% 模块间连接
    A1 --> B
    A2 --> B
    A3 --> F
    F1 --> C
    F2 --> B
    
    %% 样式定义
    classDef engineer fill:#e1f5fe,stroke:#0277bd,stroke-width:2px,color:#000
    classDef engAction fill:#b3e5fc,stroke:#0288d1,stroke-width:1px,color:#000
    classDef admin fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px,color:#000
    classDef adminAction fill:#e1bee7,stroke:#8e24aa,stroke-width:1px,color:#000
    classDef system fill:#e8f5e8,stroke:#388e3c,stroke-width:2px,color:#000
    
    %% 子图样式
    style EngModule fill:#f0f8ff,stroke:#0277bd,stroke-width:2px
    style AdminModule fill:#faf0ff,stroke:#7b1fa2,stroke-width:2px
    style SystemModule fill:#f0fff0,stroke:#388e3c,stroke-width:2px

详细流程说明

1️⃣ 工程师操作

提交代码:

  • 使用 TortoiseGit 客户端
  • 修改测试程序代码(testtool/testimage/ATOtools/Shippingimage/BIOS 等)
  • 提交到 Git 仓库
  • 可查询历史记录和差异对比

权限申请:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
flowchart TD
    A[工程师] --> B[发送权限申请邮件]
    B --> |To|C[管理员<br/>Charles Miao]
    B --> |CC|D[工程师主管]
    B --> |CC|E[TE 主管<br/>Jason Lee]
    
    C --> F[开通权限]
    F --> G[回复邮件]
    G --> |提供使用说明|A
    
    style A fill:#e1f5fe
    style C fill:#fff3e0
    style F fill:#e8f5e8

2️⃣ 管理员职责

  • 保留服务器登录和维护权限
  • 维护 Git 仓库配置
  • 审批权限申请
  • 监控系统运行状态

3️⃣ 系统自动化

自动导出:

  • Git 仓库代码自动导出到文件服务器
  • 使用 GitCheckOut 脚本
  • 定时任务或 Web Hook 触发

邮件通知:

  • Gitea 自带邮件通知无法实现 Commit Notifier
  • 自行编写 CheckGit 脚本
  • 发送邮件给研发/NPI/TE 相关人员

产线获取:

  • 产线机台从服务器获取最新的 tool/image/BIOS 等文件
  • 自动化部署,无需人工干预

🔧 关键配置

1. 自动导出脚本(GitCheckOut)

功能:

  • 监听 Git 仓库变更
  • 自动检出最新代码到服务器
  • 记录变更日志

示例脚本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
@echo off
:: GitCheckOut.bat
set REPO_PATH=C:\git-data\repositories
set EXPORT_PATH=C:\export\testtool

cd %REPO_PATH%
git pull origin main

xcopy /E /Y /I %REPO_PATH% %EXPORT_PATH%

echo Export completed at %date% %time%

2. 邮件通知脚本(CheckGit)

功能:

  • 检查 Git 提交记录
  • 生成变更摘要
  • 发送邮件通知相关人员

参考实现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python
# CheckGit.py
import smtplib
from email.mime.text import MIMEText
import subprocess

def get_recent_commits():
    result = subprocess.run(
        ['git', 'log', '--since="24 hours ago"', '--oneline'],
        capture_output=True,
        text=True
    )
    return result.stdout

def send_email(subject, body):
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = 'git@company.com'
    msg['To'] = 'team@company.com'
    
    # 发送邮件逻辑...

if __name__ == '__main__':
    commits = get_recent_commits()
    if commits:
        send_email('Git 仓库更新通知', commits)

3. 权限管理

权限层级:

角色 权限
管理员 完全控制、用户管理、仓库配置
工程师 读写权限(需申请)
产线 只读权限(自动获取)

安全措施:

  • ✅ 去除工程师远程登录服务器权限
  • ✅ 只保留管理员登录和维护权限
  • ✅ 工程师修改程序需申请权限
  • ✅ 所有操作有审计日志

📊 实施效果

改善对比

指标 SVN 时期 Gitea+LFS 时期 改善
大文件支持 ❌ 不支持 (>2GB) ✅ 完美支持 ⬆️ 100%
仓库更新速度 慢(30 分钟+) 快(2-5 分钟) ⬆️ 85%
版本管理 基础 完整 Git 历史 ⬆️ 100%
自动化程度 低(手动) 高(自动导出 + 通知) ⬆️ 90%
权限管理 简单 细粒度控制 ⬆️ 80%
审计追溯 困难 完整日志 ⬆️ 100%

实际收益

效率提升:

  • 工程师提交代码时间:30 分钟 → 5 分钟
  • 产线获取最新程序:手动 → 自动
  • 版本追溯:困难 → 一键查询

成本节省:

  • 减少人工操作:约 2 小时/天
  • 降低错误率:版本错误减少 95%
  • 节省存储空间:LFS 去重,节省约 60% 空间

管理提升:

  • 权限管理规范化
  • 操作流程标准化
  • 审计追溯完整化

💡 最佳实践

1. 仓库组织

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
testtool/
├── hardware-test/
   ├── power-test/
   ├── thermal-test/
   └── signal-test/
├── software-test/
   ├── os-test/
   ├── driver-test/
   └── app-test/
└── common/
    ├── scripts/
    ├── configs/
    └── docs/

2. 分支策略

1
2
3
4
5
main          ← 生产分支(受保护)
  ├── develop    ← 开发分支
  │     ├── feature/xxx  ← 功能分支
  │     └── bugfix/xxx   ← 修复分支
  └── release/v1.0 ← 发布分支

3. 提交规范

1
2
3
4
5
feat: 添加新的电源测试模块
fix: 修复温度采集异常问题
docs: 更新测试流程文档
refactor: 重构数据采集模块
test: 添加压力测试用例

4. LFS 文件类型建议

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 测试镜像
git lfs track "*.iso"
git lfs track "*.img"
git lfs track "*.vmdk"

# 压缩文件
git lfs track "*.zip"
git lfs track "*.7z"
git lfs track "*.rar"

# 二进制文件
git lfs track "*.bin"
git lfs track "*.exe"
git lfs track "*.dll"

# 大数据集
git lfs track "*.csv"
git lfs track "*.xlsx"

⚠️ 常见问题

Q1: LFS 推送失败

错误信息:

1
batch response: This repository is over its LFS storage quota

解决方案:

  • 检查 LFS 存储配额
  • 清理不需要的 LFS 文件
  • 升级存储套餐或扩容

Q2: 仓库历史过大

问题: 迁移前仓库已经包含大量大文件历史

解决方案:

1
2
3
4
5
# 使用 git lfs migrate 清理历史
git lfs migrate import --include="*.zip,*.7z" --everything

# 强制推送(会重写历史,需谨慎)
git push --force-with-lease origin main

Q3: 自动导出失败

排查步骤:

  1. 检查 Git 仓库权限
  2. 检查导出路径权限
  3. 查看脚本日志
  4. 手动执行脚本测试

Q4: 邮件通知不发送

排查步骤:

  1. 检查 SMTP 服务器配置
  2. 检查邮箱账号密码
  3. 查看邮件服务器日志
  4. 测试手动发送

📚 参考资料

官方文档

教程资源

工具下载


🎯 总结

通过引入 Gitea + LFS,我们成功解决了 SVN 无法处理大文件的问题,并实现了:

完整的版本控制 - Git 的强大功能
大文件支持 - LFS 完美解决 2GB+ 文件
自动化流程 - 自动导出 + 邮件通知
权限管理 - 细粒度的访问控制
审计追溯 - 完整的操作日志

这套方案已经在生产环境中稳定运行,为测试程序管理提供了可靠保障。


本文基于实际生产环境实施经验总结,具体配置需根据实际情况调整。

最后更新:2026-03-13