Commit and Push 是一个安全的提交与推送工作流,在暂存之前先筛查密钥和敏感文件,检测子模块以进行有针对性的提交,并处理包括推送失败恢复在内的完整提交-推送周期。
用途
该技能用于在将改动提交并推送到 Git 仓库时,提供一套带安全筛查的标准化流程,降低误提交密钥、凭据或敏感文件的风险,并妥善处理子模块仓库的提交范围问题。
主要能力
阶段一:安全筛查
安全筛查在任何暂存操作之前运行,用于发现若被提交会带来风险的文件和内容。
检测目标包括:
- 密钥和凭据(API 密钥、令牌、密码、私钥)
- 含敏感值的环境与配置文件(.env、.env.*、凭据文件)
- 证书与密钥文件(.pem、.key、.p12、.pfx、.jks)
- 云服务商凭据文件(AWS、GCP、Azure 配置)
- 数据库连接字符串与转储文件
- 大型二进制文件与构建产物
筛查过程:
- 将 git status 输出与已知敏感文件模式进行比对(参见 sensitive-patterns.md)
- 扫描 git diff 内容中的内联密钥——高熵字符串、API 密钥前缀、硬编码密码、连接字符串
- 将标记的文件或内容呈现给用户,并建议排除、继续或中止
- 对于不明确的情况(例如可能包含也可能不包含真实凭据的配置文件),在继续之前提交给用户澄清
阶段二:子模块检测
带有子模块的仓库(桥接仓库)需要用户明确指示提交范围。
检测方式:git submodule status --recursive 识别子模块及其变更状态(+ 前缀表示未提交的更改)。
当存在有变更的子模块且范围未指定时:
- 将变更的子模块列表和父仓库呈现给用户
- 用户选择本次提交周期要包含哪些
- 选定的子模块先提交并推送(深度优先),然后父仓库暂存更新后的子模块引用
当不存在子模块或范围已指定时:跳过此阶段。
阶段三:变更分析
对已暂存和未暂存的变更进行分析,为生成提交信息提供依据。
输入:
- git status——变更、已暂存和未跟踪文件的概览
- git diff 和 git diff --staged——详细的变更内容
- git log --oneline -5——近期提交风格,用于保持一致
提交信息生成:
- 当仓库遵循约定式提交格式时使用该格式(从近期历史中检测)
- 信息侧重于“为什么”而非“做了什么”
- 当变更局限于某处时包含范围(例如 fix(auth): ...)
- 提交信息仅包含变更描述——不包含共同作者署名
阶段四:暂存、提交、推送
- 暂存:通过阶段一筛查的文件使用 git add 并指定明确文件路径进行暂存——不使用 git add . 或 git add -A 这类笼统命令。
- 提交:使用阶段三生成的信息创建提交。
- 推送:git push 将变更发送到远程。当不存在上游跟踪时使用 git push -u origin <branch>。
阶段五:推送失败恢复
- 推送被拒(非快进):尝试 git fetch + git rebase,然后重试推送。
- 强制推送:需要用户明确授权。使用 --force-with-lease(而非 --force)。
- 冲突或无法解决的错误:向用户报告完整上下文以便手动解决。
使用方式
该技能以工作流形式运行,依次执行安全筛查、子模块检测、变更分析、暂存提交推送以及推送失败恢复。可接受可选的用户提供上下文:要提交的特定文件、提交信息覆盖、范围指令(例如“仅父仓库”“仅子模块 X”)。
参考文件
- sensitive-patterns.md:在阶段一阅读——敏感文件模式和内联密钥指标的完整列表。
适用场景
适用于需要将改动提交并推送到 Git 仓库的场景,尤其是涉及敏感文件筛查、子模块仓库以及需要处理推送失败恢复的情况。
限制
资料未提供关于平台支持、收费、价格、具体效果或性能的说明。