80bd1136f2633066f71fa01461307a3e57b4ec92
Git 自动同步 · 网页控制台(git-sync-web)
将 git-auto-sync(原 Bash 脚本版定时同步工具)的能力搬上网页:用浏览器即可监控、手动触发、查看差异、在线编辑文件、就地解决冲突,无需登录服务器敲命令行。
单二进制、纯标准库实现(Go 1.25+),前端资源通过 go:embed 内嵌,零外部依赖、零运行时下载,拷贝一个 exe 即可运行。
核心功能
1. 仓库总览(Dashboard)
- 每个被监控仓库一张卡片:同步状态灯、领先/落后提交数、本地改动文件数。
- 运行中的仓库实时显示;关闭「自动同步」的仓库标注「手动模式」徽标,仅响应手动触发。
- 顶部按钮「全部启动 / 全部暂停」一键管控。
2. 实时活动(SSE 日志)
- 右侧实时日志面板通过 Server-Sent Events 推送每个仓库的同步过程、提交、冲突等事件,并带错误/警告高亮。
- 支持按关键字过滤、一键清空。
3. 手动同步
- 每个仓库提供「获取 / 拉取 / 推送」按钮,随时手动触发,不必等待定时调度。
4. 差异查看(Diff)
- 支持「工作区 / 已暂存 / 某次提交」三种范围;统一视图与并排(split)视图切换。
- 可选的词级差异(
git --word-diff=plain),改动以行内增删高亮呈现。 - 一键复制差异内容、下载
.patch文件;编辑器内「对比此文件」可只看当前文件的改动。
5. 网页端文件编辑
- 文件树列出仓库内可跟踪 / 未跟踪文件,并标注改动状态(M/A/D/?)。
- 点击文件即可在线读取与编辑,保存可「仅写盘」或「保存并提交」。
- 内置 CodeMirror 语法高亮;编辑过程中自动缓存草稿到浏览器
localStorage,刷新不丢稿,可「放弃草稿」回滚。 - 二进制文件自动识别并只读提示。
6. 冲突解决
- 拉取冲突:选择「放弃合并」或「我已在本地解决,继续」。
- 推送冲突(non-fast-forward):提供「强制推送(--force-with-lease)」或「放弃」。
- 冲突文件内联编辑:直接在网页展开冲突文件、编辑解决、保存并标记已解决;所有冲突处理完毕时自动结束合并/变基。
7. 自动同步 / 自动提交 / Cron
- 每个仓库可设固定间隔(秒)或 Cron 表达式自动拉取推送(Cron 非空时优先于固定间隔)。
- 「自动提交」开启后,检测到工作区脏文件会自动
add -A+commit再推送。 - 「自动同步」开关可单独关闭——关闭后该仓库不再自动运行,仅响应手动同步。
8. 提交历史
- 浏览仓库提交记录,点击展开单条提交的详细 diff。提交哈希经正则白名单校验,防止命令注入。
9. 统计
- 每次同步写入 CSV 统计(领先/落后/改动等),网页端以图表呈现近 30 天趋势。
10. 访问密码(可选)
- 启动时加
-password参数启用鉴权:生成 30 天会话 cookie,除静态资源外的 API 均受保护。
编译与运行
# 编译(会重新内嵌 static 目录下的前端资源,改前端后必须重新 build)
go build -o git-auto.exe .
# Windows下可能需要执行如下命令编译:
go build -buildvcs=false -o git-auto.exe .
# 运行
./git-auto.exe -dir "C:/OtherFiles/Github/git-auto-sync" -addr 127.0.0.1:5757
| 参数 | 说明 | 默认值 |
|---|---|---|
-dir |
项目根目录,需包含 configs/、logs/、stats/ |
. |
-addr |
监听地址 | 127.0.0.1:5757 |
-password |
访问密码(为空则不启用鉴权) | 空 |
启动后浏览器打开 http://127.0.0.1:5757 即可。
配置文件格式
监控目标以 .conf 文件存放在 -dir 指定的 configs/ 目录下,兼容原 Bash 脚本的配置字段:
# Git 自动同步配置 - 示例
REPO_PATH="/c/OtherFiles/Github/your-repo" # 支持 Git Bash 风格 /c/... 路径,会自动转为 Windows 路径
REMOTE_NAME="origin"
REMOTE_URL="https://example.com/you/repo.git"
# 多远程写法:REMOTES="origin=https://a.git,fork=https://b.git"
BRANCH="main"
MODE="both" # both / push / pull
INTERVAL="60" # 固定间隔(秒)
CRON="" # 可选,cron 表达式优先于 INTERVAL
LOG_FILE="/c/.../sync.log"
AUTH_METHOD="ssh" # ssh / https
AUTO_COMMIT="0" # 1 开启自动提交
AUTO_SYNC="1" # 0 关闭自动同步(仅手动)
CONFLICT_STRATEGY="merge" # merge / rebase
PUSH_STRATEGY="manual" # manual / auto
说明:路径既支持
C:/...也支持 Git Bash 的/c/...,后者会在加载时自动规范化;.git内部目录被禁止通过网页访问。
目录结构
git-sync-web/
├── main.go # 入口:-dir / -addr / -password,内嵌 static
├── config.go # .conf 解析与写回、Windows 路径规范化
├── git.go # git 执行器、领先/落后、冲突检测
├── engine.go # 每仓库调度循环、SSE 事件总线、文件树/读写
├── cron.go # 纯标准库 5 段 cron 解析(含单测)
├── server.go # REST API 与静态资源服务
└── static/ # 前端:index.html / app.js / style.css / cm-boot.js / vendor/cm/
设计要点
- 单二进制 + 内嵌前端:部署只需一个可执行文件,不依赖任何外部 CDN 或运行时。
- 安全边界:仓库内路径经
safeRepoPath严格校验,禁止..越界与访问.git;提交哈希白名单防注入;网页编辑单文件 ≤1MB 且拒绝二进制写入。 - 优雅降级:CodeMirror 资源缺失或初始化失败时,编辑器自动回退原生
<textarea>,核心功能不受影响。
Languages
Go
49.6%
JavaScript
27%
HTML
11.8%
CSS
11.5%
Makefile
0.1%