![[Git] Vibe Coding一个Git分支保护管理工具](http://pic.xiahunao.cn/yaotu/[Git] Vibe Coding一个Git分支保护管理工具)
背景故事由于项目管理需要之前部署过一个Git的钩子用来控制项目的分支代码提交权限。详见这篇博文《[Git] SSHGit 实现控制分支的提交权限》。苦于没有界面使用起来不太方便每次都得去修改脚本。然后想到现在Vibe Coding很火利用它来给钩子加个界面既方便操作又紧跟时代的步伐挣扎着做一个不想被淘汰的码农听起来这是一个多么令人悲伤的事情。可能有人要问为啥不用GitLab之类的第三方平台还要重复造轮子因为。。。项目太远古了当初就只通过GitSSH搭起了源码管理平台没有引入界面。整个项目是基于 Flask 的 Git 分支保护 Web 管理界面用于管理多个项目的分支保护策略。先放一个展示页面大致的功能都能体现出来虽然以前代码靠手搓现在可以通过一句句大白话直接喂给编辑器但页面怎么设计页面还是你说了算。我自己觉得最满意的是加了一个“自动锁定”的功能也是这个页面最大的亮点了。因为其他功能各大平台都有但自动锁定这个功能其他平台不见得有。什么场景下会用到呢比如我经常会出现打开了分支其他同学提交完了代码后我忘记关了。别问为啥有这么随意的提交流程居然不走PR因为我们不是正规军用不上哈哈哈哈好了故事就讲到这里点这里看源码以下是更详细的项目介绍。功能特性项目管理添加、删除项目支持手动添加和批量扫描仓库分支保护锁定/放开分支禁止向受保护分支直接推送自动锁定设置分支自动锁定时间放开后自动恢复锁定全局配置统一管理默认分支配置应用到所有项目会话管理自动超时检测安全退出登录状态同步定期刷新分支状态实时显示最新锁定状态历史通知操作记录历史管理支持查看和清除通知历史后台任务自动锁定检查器定时检查并执行自动锁定任务技术栈后端Flask 2.0前端原生 JavaScript Bootstrap数据存储JSON 文件Git 钩子pre-receive 钩子脚本项目结构git-ctl-webui/ ├── app.py # Flask 主应用 ├── config/ # 配置目录 │ ├── config.json # 系统配置会话超时、登录凭证、端口等 │ └── projects/ # 项目配置目录 │ ├── _default.json # 全局默认配置 │ ├── _default.txt # 全局默认配置txt格式供钩子使用 │ └── {project}.json/txt # 各项目配置 ├── hooks/ # Git 钩子脚本 │ └── pre-receive # 分支保护钩子 ├── log/ # 日志目录 │ └── operations.log # 操作日志 ├── templates/ # Jinja2 模板 │ └── index.html # 主页面 ├── static/ # 静态资源 │ └── app.js # 前端 JavaScript └── test-repos/ # 测试仓库目录快速开始1. 环境准备CentOS 7# 安装 Python3 和 pipyuminstall-ypython36 python36-pip# 升级 pippip3install--upgradepip2. 安装依赖pip3installflask3. 启动应用使用管理脚本推荐# 启动服务后台运行bashbin/git-ctl.sh start# 停止服务bashbin/git-ctl.sh stop# 重启服务bashbin/git-ctl.sh restart# 查看状态bashbin/git-ctl.sh status详细说明服务后台运行不占用终端日志输出到log/app.log可通过 logrotate 管理日志大小PID 文件存放在/var/run/git-ctl-webui.pid日志管理使用 logrotate 管理日志文件大小# 安装 logrotate如果没有yuminstall-ylogrotate# 配置 logrotatecplogrotate.conf /etc/logrotate.d/git-ctl-webui# 测试配置logrotate-d/etc/logrotate.d/git-ctl-webui# 手动执行一次logrotate-f/etc/logrotate.d/git-ctl-webuilogrotate 配置说明(logrotate.conf)daily每天轮转一次rotate 7保留7个历史日志compress压缩历史日志delaycompress延迟压缩等下一次轮转时压缩copytruncate复制原文件后清空不中断服务写入应用默认运行在http://localhost:5000端口可在 config.json 中配置4. 登录用户名admin可在 config.json 中修改密码admin可在 config.json 中修改配置说明系统配置 (config/config.json){session_timeout_minutes:5,username:admin,password:admin,port:5000}参数说明默认值session_timeout_minutes会话超时时间分钟5username登录用户名adminpassword登录密码adminportWeb 服务端口5000项目配置 (config/projects/{project}.json){branches:[{name:refs/heads/main,locked:true,auto_lock_time:30,auto_lock_unit:minutes}]}参数说明name分支名称完整引用格式locked是否锁定true锁定false放开auto_lock_time自动锁定时间0不自动锁定auto_lock_unit时间单位minutes/hoursGit 钩子配置将hooks/pre-receive脚本复制到 Git 仓库的hooks/目录cphooks/pre-receive /path/to/git/repo/hooks/pre-receivechmodx /path/to/git/repo/hooks/pre-receive环境变量变量名说明默认值GIT_CTL_CONFIG_DIR配置目录路径/opt/git-ctl-webui/configAPI 接口接口方法说明/loginPOST用户登录/check_sessionGET检查会话状态/add_projectPOST添加项目/del_projectGET删除项目/scan_reposPOST扫描仓库/get_project_branchesGET获取项目分支/add_branchPOST添加分支/del_branchGET删除分支/toggle_branchGET切换分支锁定状态/sync_branch_to_allGET同步分支到所有项目/statsGET获取统计信息/update_settingsPOST更新系统设置使用说明添加项目在项目管理选项卡中输入项目名称或点击扫描仓库按钮批量发现 Git 仓库管理分支选择项目后点击添加分支按钮输入分支名称如refs/heads/main使用锁定/放开按钮控制分支保护状态自动锁定在分支编辑界面设置自动锁定时间放开分支后系统会在指定时间后自动锁定全局配置选择全局配置项目配置默认分支保护策略使用应用到所有项目按钮同步配置安全特性会话超时自动退出所有操作记录日志分支保护钩子验证许可证MIT License