Slash commands:不再有无意义的提交

发布: (2026年5月1日 GMT+8 11:18)
8 分钟阅读
原文: Dev.to

Source: Dev.to

我在 Claude Code 中最常使用的功能之一是 slash commands
每个开发者都应该拥有的命令是 /commit。它可以清理许多开发者(即使是有经验的开发者)共有的习惯。/commit 让提交栏变得明确,整个团队最终以相同且一致的方式编写提交信息。

我一直很重视提交信息。即使是注重提交信息的开发者,也可能在疲惫的周五或大规模重构的过程中,出现 "fixes" 或通用的 "update" 之类的提交信息混入仓库。这就导致仓库积累了一层噪音,三个月后没人能解读。

什么是斜杠命令?

斜杠命令并非 Claude Code 独有。像 OpenCodeCodex CLIAiderContinue 等工具也允许你自定义命令。格式和触发方式各不相同,但理念相同:一次简短的按键即可运行你事先编写的更长提示。

Claude Code 实现

在 Claude Code 中,斜杠命令仅仅是一个 Markdown 文件

范围路径
全局~/.claude/commands/.md
项目特定.claude/commands/.md

当文件存在时,/ 可作为快捷方式。文件的 front‑matter 包含 description;正文则是你在调用命令时代理读取的提示。

无 DSL、无 SDK、无插件清单。
Markdown 文件输入 → 斜杠命令输出。

提交问题

即使在循环中有一个优秀的代理,直接使用 "commit my changes" 也只能得到还算过得去但并不理想的结果:

  • 代理只挑选一种类型,写出一个可用的主题行,却把不相关的更改都塞进同一个提交。
  • 这总比什么都不做好,但我们可以做得更好。

期望的工作流程

  1. 读取更改 并按领域对其进行分组。
  2. 为每个分组 编写合适的提交信息,遵循 Conventional Commits 规范。
  3. 跳过不应提交的文件(例如,生成的文件、锁文件)。

/commit – 我的斜杠命令

以下是我构建的斜杠命令,用于保持提交的整洁和一致。

---
description: "Analyze all changes and commit in logical groups."
---

# Commit

将此文件放置在 ~/.claude/commands/commit.md(或项目特定的位置),然后使用 /commit 调用它。

运行时,命令会:

  1. 扫描工作树中的更改。
  2. 按逻辑域(例如 featfixdocs)对修改进行分组。
  3. 为每个分组生成符合 Conventional Commit 规范的提交信息。
  4. 对相应的文件执行 git add 并创建提交。

欢迎在提示正文中添加额外的逻辑(例如自定义忽略模式、交互式确认,或与 CI 流水线的集成)。

步骤 1:调查更改

  • 运行 bin/commit-survey 以获取文件列表和分类。
  • 如需了解更改的更多上下文,请阅读关键文件的差异。

第2步:分组更改

使用 --- classified --- 输出作为起点,然后将其细化为逻辑提交。

分组策略

  • 按域/功能 – 例如,所有身份验证更改放在一起。
  • 按层 – 例如,模型测试、控制器测试。
  • 按类型 – 例如,所有配置更改、所有依赖更新。

注意: 列在 [skip] 中的文件 不应 被提交。如果对某个文件不确定,请 跳过 它。

第 3 步 – 为每个组提交

对于每个组,将 stage + commit 合并为一次调用:

git add  && git commit -m ""

最独立最依赖 的顺序提交:

  1. 首先提交配置 / 工具链的更改
  2. 源代码更改
  3. 测试更改
  4. 最后提交生成的文件

Source:

三步引擎

bin/commit-survey

步骤 1 调用一个脚本对文件进行分类。与其让代理每次运行 git statusgit 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 version
  • feat(templates): add language toggle
  • feat(blog): bootstrap section

而不是一次性提交所有更改。

实际操作

当我输入 /commit 时,Claude:

  1. 运行 bin/commit-survey 并读取输出。
  2. 读取需要更多上下文的文件的差异。
  3. 将每个分组暂存并提交,使用 Conventional Commits 消息。
  4. 静默跳过 .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

三个提交,每个都有明确的范围。

自行创建

  1. 复制上面的脚本。
  2. 将其保存为 ~/.claude/commands/commit.md(全局)或 .claude/commands/commit.md(项目本地)。
  3. 调整 bucket 模式以匹配你的技术栈。

你可以为其他重复性任务创建类似的斜杠命令:/changelog/release/pr-draft/deploy 等。每个命令仅是一个 markdown 文件,包含你本来要在聊天中输入的步骤。

完结

一个小的辅助脚本加上自定义的 Claude 斜杠命令就足以让 AI 可靠地处理日常的 Git 工作。再也没有通用的“update”提交——每一次提交都反映了你在 markdown 文件中编码的意图。

来源

最初发布于 guilherme44.com.

0 浏览
Back to Blog

相关文章

阅读更多 »

伟大抽象的‘隐藏’成本

抽象的问题 在计算领域,我们倾向于抽象掉复杂性。这样做让人感到解放,因为它让我们能够专注于更大的图景……