Files

5.8 KiB
Raw Permalink Blame History

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>,核心功能不受影响。