我用 Go 写了个工具,3 行命令把本地目录变成 Git 服务器

51 阅读8分钟

我用 Go 写了个工具,3 行命令把本地目录变成 Git 服务器

lgh.jpg

前言

作为一名开发者,你是否遇到过这些场景:

  • 🤖 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 安装

方式一:下载预编译二进制(推荐)

根据你的系统下载对应的版本:

系统架构下载链接
macOSApple Silicon (M1/M2/M3)lgh-1.0.2-darwin-arm64
macOSIntellgh-1.0.2-darwin-amd64
Linuxx86_64lgh-1.0.2-linux-amd64
Windowsx86_64lgh-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,你可以:

  1. 在本地启动 Git 服务器
  2. 通过隧道暴露给 AI 工具
  3. AI 工具通过 HTTP 协议访问你的代码
  4. 完成后关闭隧道,代码依然在本地
# 启用认证
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 技术栈


六、与其他方案对比

特性LGHGitLabGiteagit 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:可以,但建议:

  1. 使用反向代理(Nginx/Caddy)
  2. 启用 HTTPS
  3. 配置防火墙
  4. 定期备份

Q5:为什么不直接用 git daemon

Agit 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 语言爱好者,热衷于开发实用的开发者工具。

如果你对 Go 语言开发、DevOps 工具感兴趣,欢迎关注我!


标签:#Go #Git #DevOps #开源项目 #开发工具 #效率工具