Slash commands:不再有无意义的提交
Source: Dev.to
我在 Claude Code 中最常使用的功能之一是 slash commands。
每个开发者都应该拥有的命令是 /commit。它可以清理许多开发者(即使是有经验的开发者)共有的习惯。/commit 让提交栏变得明确,整个团队最终以相同且一致的方式编写提交信息。
我一直很重视提交信息。即使是注重提交信息的开发者,也可能在疲惫的周五或大规模重构的过程中,出现 "fixes" 或通用的 "update" 之类的提交信息混入仓库。这就导致仓库积累了一层噪音,三个月后没人能解读。
什么是斜杠命令?
斜杠命令并非 Claude Code 独有。像 OpenCode、Codex CLI、Aider 和 Continue 等工具也允许你自定义命令。格式和触发方式各不相同,但理念相同:一次简短的按键即可运行你事先编写的更长提示。
Claude Code 实现
在 Claude Code 中,斜杠命令仅仅是一个 Markdown 文件:
| 范围 | 路径 |
|---|---|
| 全局 | ~/.claude/commands/.md |
| 项目特定 | .claude/commands/.md |
当文件存在时,/ 可作为快捷方式。文件的 front‑matter 包含 description;正文则是你在调用命令时代理读取的提示。
无 DSL、无 SDK、无插件清单。
Markdown 文件输入 → 斜杠命令输出。
提交问题
即使在循环中有一个优秀的代理,直接使用 "commit my changes" 也只能得到还算过得去但并不理想的结果:
- 代理只挑选一种类型,写出一个可用的主题行,却把不相关的更改都塞进同一个提交。
- 这总比什么都不做好,但我们可以做得更好。
期望的工作流程
- 读取更改 并按领域对其进行分组。
- 为每个分组 编写合适的提交信息,遵循 Conventional Commits 规范。
- 跳过不应提交的文件(例如,生成的文件、锁文件)。
/commit – 我的斜杠命令
以下是我构建的斜杠命令,用于保持提交的整洁和一致。
---
description: "Analyze all changes and commit in logical groups."
---
# Commit
将此文件放置在 ~/.claude/commands/commit.md(或项目特定的位置),然后使用 /commit 调用它。
运行时,命令会:
- 扫描工作树中的更改。
- 按逻辑域(例如
feat、fix、docs)对修改进行分组。 - 为每个分组生成符合 Conventional Commit 规范的提交信息。
- 对相应的文件执行
git add并创建提交。
欢迎在提示正文中添加额外的逻辑(例如自定义忽略模式、交互式确认,或与 CI 流水线的集成)。
步骤 1:调查更改
- 运行
bin/commit-survey以获取文件列表和分类。 - 如需了解更改的更多上下文,请阅读关键文件的差异。
第2步:分组更改
使用 --- classified --- 输出作为起点,然后将其细化为逻辑提交。
分组策略
- 按域/功能 – 例如,所有身份验证更改放在一起。
- 按层 – 例如,模型测试、控制器测试。
- 按类型 – 例如,所有配置更改、所有依赖更新。
注意: 列在
[skip]中的文件 不应 被提交。如果对某个文件不确定,请 跳过 它。
第 3 步 – 为每个组提交
对于每个组,将 stage + commit 合并为一次调用:
git add && git commit -m ""
按 最独立 到 最依赖 的顺序提交:
- 首先提交配置 / 工具链的更改
- 源代码更改
- 测试更改
- 最后提交生成的文件
Source: …
三步引擎
bin/commit-survey
步骤 1 调用一个脚本对文件进行分类。与其让代理每次运行 git status、git diff 并解析输出(每次运行都会消耗 token),不如使用一个简短的 Ruby 脚本一次性完成分类并返回可预测的结果。
Ruby 辅助脚本(≈ 22 行)
SKIP_PATTERNS = %w[.env credentials master.key tasks.md notes.txt scratch .claude/]
BUCKETS = {
"skip" => ->(path) { SKIP_PATTERNS.any? { |pat| path.include?(pat) } },
"test" => ->(path) { path.start_with?("test/") },
"db" => ->(path) { path.start_with?("db/") },
"config" => ->(path) { path.start_with?("config/", "Gemfile", ".rubocop", "Procfile", "Rakefile") },
"docs" => ->(path) { path.start_with?("docs/", "README") || path.end_with?(".md") },
"app" => ->(_) { true }
}
paths = `git status --porcelain`.lines(chomp: true).map { |l| l[3..] }
grouped = BUCKETS.keys.to_h { |b| [b, []] }
paths.each do |path|
bucket = BUCKETS.find { |_, matcher| matcher.call(path) }.first
grouped[bucket] << path
end
BUCKETS.each_key do |bucket|
files = grouped[bucket]
puts "[#{bucket}] #{files.empty? ? "(none)" : files.join(", ")}"
end
skip先执行,因此机密信息和笔记永远不会被暂存。- 其余的 bucket 可以根据项目进行微调(例如,Phoenix 应用可以添加
lib/、priv/repo/migrations/、assets/;Next.js 应用可以添加pages/、app/、public/、prisma/)。
在脏仓库上运行该脚本会得到类似以下的输出:
--- unstaged ---
M config.toml
M templates/index.html
--- untracked ---
content/blog/_index.md
content/blog/post.md
--- classified ---
[skip] (none)
[test] (none)
[db] (none)
[config] config.toml
[docs] content/blog/_index.md, content/blog/post.md
[app] templates/index.html
现在,代理可以生成更有针对性的提交,例如:
chore(config): bump zola versionfeat(templates): add language togglefeat(blog): bootstrap section
而不是一次性提交所有更改。
实际操作
当我输入 /commit 时,Claude:
- 运行
bin/commit-survey并读取输出。 - 读取需要更多上下文的文件的差异。
- 将每个分组暂存并提交,使用 Conventional Commits 消息。
- 静默跳过
.env和其他任何机密文件。
整个过程约耗时 30 秒,生成干净且有明确范围的提交。
实际示例(博客文章)
运行前的调查输出:
[skip] (none)
[test] (none)
[db] (none)
[config] config.toml
[docs] content/blog/slash-commands-no-more-bad-commits.md,
content/blog/slash-commands-no-more-bad-commits.pt-br.md
[app] sass/_predefined.scss, sass/style.scss
/commit 的结果:
feat(blog): add slash commands post in EN and pt‑br
chore(config): drop syntax theme, switch to monochrome code blocks
style(sass): apply osaka jade palette and bump body font
三个提交,每个都有明确的范围。
自行创建
- 复制上面的脚本。
- 将其保存为
~/.claude/commands/commit.md(全局)或.claude/commands/commit.md(项目本地)。 - 调整 bucket 模式以匹配你的技术栈。
你可以为其他重复性任务创建类似的斜杠命令:/changelog、/release、/pr-draft、/deploy 等。每个命令仅是一个 markdown 文件,包含你本来要在聊天中输入的步骤。
完结
一个小的辅助脚本加上自定义的 Claude 斜杠命令就足以让 AI 可靠地处理日常的 Git 工作。再也没有通用的“update”提交——每一次提交都反映了你在 markdown 文件中编码的意图。
来源
- Conventional Commits 1.0.0
- Claude Code custom commands docs
- OpenCode
- OpenAI Codex CLI
- Aider
- Continue
最初发布于 guilherme44.com.