我用 Go 写了个工具,3 行命令把本地目录变成 Git 服务器
前言
作为一名开发者,你是否遇到过这些场景:
- 🤖 AI 编程助手需要访问你的本地代码仓库,但你不想把代码推到 GitHub
- 👥 临时协作:想和同事快速共享代码,但懒得创建远程仓库
- 💻 多设备开发:家里的台式机和公司的笔记本需要同步代码,但又不想每次都推到远程
- 🧪 CI/CD 测试:需要一个临时的 Git 服务器来测试自动化流程
传统的解决方案要么太重(GitLab、Gitea 需要数据库、Web 服务器),要么不够安全(git daemon 没有认证),要么功能受限(文件共享不支持 Git 协议)。
于是,我写了 LGH (LocalGitHub) —— 一个零配置、轻量级的本地 Git 托管服务。
🔗 GitHub 仓库:github.com/JoeGlenn121…
⭐ 如果觉得有用,欢迎给个 Star!
一、LGH 是什么?
LGH 是一个用 Go 编写的本地 Git HTTP 服务器,它可以:
✅ 3 行命令启动一个 Git 服务器
✅ 单个二进制文件,无需安装任何依赖
✅ 标准 Git HTTP 协议,兼容所有 Git 客户端
✅ 灵活的网络模式:本地、局域网、互联网都支持
✅ 可选的身份验证,安全可控
简单来说:把你的任何本地目录瞬间变成一个 Git 服务器。
二、快速上手
2.1 安装
方式一:下载预编译二进制(推荐)
根据你的系统下载对应的版本:
| 系统 | 架构 | 下载链接 |
|---|---|---|
| macOS | Apple Silicon (M1/M2/M3) | lgh-1.0.2-darwin-arm64 |
| macOS | Intel | lgh-1.0.2-darwin-amd64 |
| Linux | x86_64 | lgh-1.0.2-linux-amd64 |
| Windows | x86_64 | lgh-1.0.2-windows-amd64.exe |
# macOS/Linux 安装示例
chmod +x lgh-1.0.2-darwin-arm64
sudo mv lgh-1.0.2-darwin-arm64 /usr/local/bin/lgh
方式二:一键安装脚本
curl -sSL https://raw.githubusercontent.com/JoeGlenn1213/lgh/main/install.sh | bash
方式三:Homebrew (macOS)
brew tap JoeGlenn1213/tap
brew install lgh
方式四:Go Install
go install github.com/JoeGlenn1213/lgh/cmd/lgh@latest
2.2 三行命令启动
# 1. 初始化 LGH 环境
lgh init
# 2. 启动服务器(后台运行)
lgh serve -d
# 3. 添加当前项目
cd your-project
lgh add .
#注意这里还是需要git提交的,要不只是空仓,或者更新最新版本使用如下命令
lgh add . --push
#请下载V1.0.9以上版本,本来不打算支持push,但第要3行命令直接用地址,做了--push妥协
就这么简单!你的本地 Git 服务器已经运行在 http://127.0.0.1:9418 了。
三、核心功能演示
3.1 推送代码到本地服务器
LGH 会自动为你的项目添加一个名为 lgh 的 remote:
# 查看 remote
git remote -v
# 输出:
# lgh http://127.0.0.1:9418/your-project.git (fetch)
# lgh http://127.0.0.1:9418/your-project.git (push)
# 推送代码
git push lgh main
3.2 从其他地方克隆
在同一台机器的任何位置,或者局域网内的其他设备:
git clone http://127.0.0.1:9418/your-project.git
3.3 查看所有仓库
lgh list
3.4 查看服务器状态
lgh status
四、进阶玩法
4.1 局域网共享(团队协作)
默认情况下,LGH 只监听 127.0.0.1,仅本机可访问。如果想在局域网内共享:
# 1. 启用身份验证(重要!)
lgh auth setup
# 按提示输入用户名和密码
# 2. 以只读模式启动,并绑定到所有网络接口
lgh serve --bind 0.0.0.0 --read-only --mdns
参数说明:
--bind 0.0.0.0:监听所有网络接口,允许局域网访问--read-only:只读模式,防止他人修改你的仓库--mdns:启用 mDNS,局域网内自动发现
同事可以这样访问:
# 方式一:使用你的 IP 地址
git clone http://username:password@192.168.1.100:9418/project.git
# 方式二:使用 mDNS 主机名(macOS/Linux)
git clone http://username:password@your-hostname.local:9418/project.git
4.2 暴露到互联网(临时分享)
LGH 内置了隧道功能,可以一键将本地服务暴露到互联网:
# 查看支持的隧道方式
lgh tunnel
# 使用 ngrok
lgh tunnel --method ngrok
# 使用 Cloudflare Tunnel
lgh tunnel --method cloudflared
⚠️ 安全提示:暴露到互联网前,务必先执行 lgh auth setup 启用身份验证!
4.3 AI 编程场景
这是我最常用的场景。很多 AI 编程助手(如 Cursor、GitHub Copilot)需要访问你的代码仓库,但你可能不想把未完成的代码推到 GitHub。
使用 LGH,你可以:
- 在本地启动 Git 服务器
- 通过隧道暴露给 AI 工具
- AI 工具通过 HTTP 协议访问你的代码
- 完成后关闭隧道,代码依然在本地
# 启用认证
lgh auth setup
# 启动服务器
lgh serve -d
# 暴露到互联网
lgh tunnel --method ngrok
# 将生成的 URL 提供给 AI 工具
# 例如:https://abc123.ngrok.io/my-project.git
五、技术实现
5.1 架构设计
LGH 的核心是对 Git 原生的 git-http-backend 的封装:
客户端 (git clone/push)
↓
LGH HTTP 服务器
↓ (认证、路由)
git-http-backend
↓
本地 Git 仓库
5.2 目录结构
LGH 会在 ~/.localgithub/ 创建以下结构:
~/.localgithub/
├── config.yaml # 全局配置
├── mappings.yaml # 仓库映射关系
├── lgh.pid # 服务器进程 ID
└── repos/ # 裸仓库存储
├── MyApp.git/
└── ProjectB.git/
5.3 配置文件
~/.localgithub/config.yaml:
port: 9418
bind_address: "127.0.0.1"
repos_dir: "/Users/you/.localgithub/repos"
read_only: false
mdns_enabled: false
# 认证配置(可选)
auth_enabled: true
auth_user: "git-user"
auth_password_hash: "salt:hash..."
5.4 技术栈
- 语言:Go 1.23+
- CLI 框架:spf13/cobra
- 配置管理:spf13/viper
- 终端美化:fatih/color
- mDNS 支持:hashicorp/mdns
六、与其他方案对比
| 特性 | LGH | GitLab | Gitea | git daemon | 文件共享 |
|---|---|---|---|---|---|
| 安装复杂度 | ⭐ 单文件 | ❌ 需要数据库 | ⚠️ 需要配置 | ⭐ 简单 | ⭐ 无需安装 |
| HTTP 协议 | ✅ | ✅ | ✅ | ❌ | ❌ |
| 身份验证 | ✅ 可选 | ✅ 必须 | ✅ 必须 | ❌ | ❌ |
| Web UI | ❌ | ✅ | ✅ | ❌ | ❌ |
| 资源占用 | ⭐ <10MB | ❌ >1GB | ⚠️ ~100MB | ⭐ <5MB | ⭐ 无 |
| 启动速度 | ⭐ <1s | ❌ >30s | ⚠️ ~10s | ⭐ <1s | ⭐ 即时 |
| 局域网发现 | ✅ mDNS | ❌ | ❌ | ❌ | ✅ |
| 适用场景 | 本地/临时 | 企业级 | 团队级 | 简单共享 | 文件传输 |
LGH 的定位:填补"简单文件共享"和"完整 Git 平台"之间的空白。
七、安全性说明
7.1 默认安全策略
- ✅ 默认只监听
127.0.0.1,仅本机可访问 - ✅ 密码使用加盐哈希存储(bcrypt)
- ✅ 支持只读模式,防止误操作
7.2 不同场景的安全建议
| 场景 | 推荐配置 |
|---|---|
| 本地开发 | 默认配置(127.0.0.1) |
| 局域网共享 | --bind 0.0.0.0 --read-only + auth setup |
| 互联网暴露 | 反向代理(Caddy/Nginx)+ TLS + 认证 |
7.3 生产环境部署
如果要在生产环境使用,建议通过反向代理:
# 1. LGH 只监听本地
lgh serve
# 2. 使用 Caddy 反向代理 + 自动 HTTPS
# Caddyfile:
git.example.com {
basicauth * {
user $2a$14$...
}
reverse_proxy localhost:9418
}
八、实际使用案例
案例 1:多设备同步开发
场景:我在公司用 MacBook 开发,回家后想在台式机上继续。
传统方案:
# 公司
git push origin main
# 回家
git pull origin main
每次都要推到 GitHub,即使代码还没写完。
使用 LGH:
# 公司 MacBook
lgh serve --bind 0.0.0.0 --mdns
# 家里台式机(同一局域网)
git clone http://macbook.local:9418/project.git
git pull lgh main
不需要推到远程,局域网内直接同步。
案例 2:临时协作
场景:同事需要我的代码调试问题,但代码还没提交。
传统方案:
- 打包发微信?版本管理混乱
- 推到 GitHub?代码还没准备好
使用 LGH:
# 我的电脑
lgh auth setup
lgh serve --bind 0.0.0.0
# 告诉同事我的 IP 和账号密码
# 同事直接 clone
git clone http://user:pass@192.168.1.100:9418/project.git
案例 3:CI/CD 测试
场景:测试 GitHub Actions 的 Git 操作,但不想污染真实仓库。
使用 LGH:
# 本地启动 LGH
lgh serve -d
# 通过 ngrok 暴露
lgh tunnel --method ngrok
# 在 GitHub Actions 中使用生成的 URL
# https://abc123.ngrok.io/test-repo.git
九、常见问题
Q1:LGH 和 GitLab/Gitea 有什么区别?
A:LGH 是轻量级的本地开发工具,不是企业级 Git 平台。
- ✅ 如果你需要:快速启动、临时使用、本地开发 → 用 LGH
- ❌ 如果你需要:Web UI、Issue 管理、CI/CD、多用户权限 → 用 GitLab/Gitea
Q2:LGH 安全吗?
A:取决于你的使用场景:
- ✅ 本地开发(默认配置):非常安全,只有本机能访问
- ⚠️ 局域网共享:建议启用认证 + 只读模式
- ❌ 直接暴露到互联网:不推荐,请使用反向代理 + TLS
Q3:支持 SSH 协议吗?
A:目前只支持 HTTP 协议。SSH 协议需要管理密钥,违背了"零配置"的设计理念。
Q4:可以用于生产环境吗?
A:可以,但建议:
- 使用反向代理(Nginx/Caddy)
- 启用 HTTPS
- 配置防火墙
- 定期备份
Q5:为什么不直接用 git daemon?
A:git daemon 的问题:
- ❌ 不支持 HTTP 协议(很多工具只支持 HTTP)
- ❌ 没有身份验证
- ❌ 配置复杂
十、未来规划
LGH 目前还在快速迭代中,计划中的功能:
- Web UI(简单的仓库浏览界面)
- Webhook 支持
- 多用户权限管理
- 仓库统计信息
- Docker 镜像
- 更多隧道方式(frp、localtunnel)
欢迎提 Issue 和 PR!
十一、总结
LGH 是一个专注于本地开发场景的轻量级 Git 服务器:
✅ 零配置:3 行命令启动
✅ 轻量级:单个二进制文件,<10MB
✅ 灵活:本地、局域网、互联网都支持
✅ 安全:可选认证、只读模式、密码加密
✅ 实用:AI 编程、团队协作、多设备同步
如果你也有类似的需求,不妨试试 LGH!
🔗 GitHub 仓库:github.com/JoeGlenn121…
⭐ 觉得有用请给个 Star,你的支持是我最大的动力!
💬 有问题欢迎提 Issue,也欢迎贡献代码!
关于作者
我是 JoeGlenn,一名 Go 语言爱好者,热衷于开发实用的开发者工具。
- GitHub: @JoeGlenn1213
- 邮箱: [Glenn.1213@aol.com]
如果你对 Go 语言开发、DevOps 工具感兴趣,欢迎关注我!
标签:#Go #Git #DevOps #开源项目 #开发工具 #效率工具