# 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 均受保护。 --- ## 编译与运行 ```bash # 编译(会重新内嵌 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 脚本的配置字段: ```ini # 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 资源缺失或初始化失败时,编辑器自动回退原生 `