Extract Strings From Commits

从指定 git 提交中自动提取所有新增/修改的字符串资源 name(含 <string> 与 <plurals>),无需手动复制 strings.xml 内容。

资源链接:【免费】原创Skill分享:从指定git提交中提取所有新增/修改的字符串资源name,无需手动复制strings.xml内容资源-CSDN下载


何时触发本 Skill

用户语句中满足以下任一条件时应当使用本 Skill:

  • 提到一个或多个 git 提交(commit / 修订号 / sha / hash)
  • 同时提到「词条」「字符串」「string」「name」「strings.xml」「plurals.xml」之一
  • 例如:
    • 「提取 commit a8e9b68 中新增的词条 name」
    • 「a8e9b68,d4f2c01 这两个提交加了哪些 string」
    • 「我刚提交的这个 hash 里新增了哪些 plurals」
    • 「extract string names from a8e9b68」

输入格式

支持以下三种输入形式(脚本会自动识别):

形式示例
单个修订号a8e9b68ba215d20c2a52c1db5d40cbe14b5e4d07 或缩写 a8e9b68
英文逗号分隔a8e9b68,d4f2c01,3a7b2e9
空格分隔a8e9b68 d4f2c01 3a7b2e9

也可以是 git 任意可解析的引用(commit-ish):

  • 完整或缩写的 commit hash
  • HEADHEAD~1HEAD~3
  • 分支名 / 标签名

Cursor 当前没有 @commit 原生引用语法。最自然的输入方式是直接在对话里写 hash,多个用英文逗号分隔。


执行流程



调用方式(Agent 必读)

平台选择策略

提供 两个等价脚本,输出已经过等价性测试逐字节一致:

脚本适用平台优先级
extract.shmacOS / Linux / Windows-with-git-bash🟢 优先
extract.ps1仅 Windows(无 bash 时回退)🔵 回退

判断逻辑(Agent 按顺序尝试):

  1. 先试 command -v bash >/dev/null 2>&1有 bash 就用 extract.sh
  2. bash 不可用时(纯 PowerShell / cmd 环境)才用 extract.ps1

团队内 mac 同学统一走 extract.sh;Windows 同学如果装了 Git for Windows(绝大多数都装了),也走 extract.sh;只有极少数纯 PowerShell 用户才会走 extract.ps1

命令模板

bash 版本(首选)

bash .cursor/skills/extract-strings-from-commits/extract.sh "<commits>"

PowerShell 版本(回退)

powershell -NoProfile -ExecutionPolicy Bypass \
  -File ".cursor/skills/extract-strings-from-commits/extract.ps1" \
  -Commits "<commits>"

实战示例

# 单个 commit
bash .cursor/skills/extract-strings-from-commits/extract.sh "a8e9b68"

# 多个用逗号
bash .cursor/skills/extract-strings-from-commits/extract.sh "a8e9b68,d4f2c01,3a7b2e9"

# 多个用空格(整体加引号)
bash .cursor/skills/extract-strings-from-commits/extract.sh "a8e9b68 d4f2c01"

# 也兼容 ps1 风格的 -Commits 参数(方便统一调用习惯)
bash .cursor/skills/extract-strings-from-commits/extract.sh -Commits "a8e9b68,d4f2c01"

注意事项

  1. 必须在 当前代码 仓库根目录下执行(脚本内部会调用 git
  2. commits 整体用双引号括起,避免 shell 把空格分开
  3. 用户原始 hash 直接透传,无需做任何预处理(脚本自己负责解析)
  4. extract.sh 必须保持 LF 行尾(已配置 .gitattributes 保护);如发现被 Windows 检出后变成 CRLF,运行 dos2unix 或 sed -i 's/\r$//' 修复

输出处理(Agent 必读)

extract.ps1 的输出分两路:

通道内容Agent 处理方式
stdout 第一行逗号拼接的 name 列表,例如 name1,name2,name3直接复制到回复正文,用代码块包起来
Host(其它行)摘要信息:count、resolved commits、warnings总结后告知用户(共多少个,哪些 commit,是否有跳过)

回复模板

从 N 个提交中共提取出 **M 个** 唯一词条 name(已去重):

```
name1,name2,name3,...
```

- 处理的提交:`a8e9b68ba215`, `d4f2c01abcde`
- ⚠️ 跳过(不存在):`deadbeef999`  ← 仅在有跳过项时显示

提取规则(Agent 需理解)

脚本的提取逻辑:

  1. 匹配范围:所有路径以 .xml 结尾的文件
  2. 匹配实体
    • <string ... name="..."> —— 任何 + 行包含该模式
    • <plurals ... name="..."> —— 任何 + 行包含该模式
    • <plurals> 块内部的 +<item> —— 取外层 plurals 的 name(处理 plurals 内部 item 修改场景)
  3. 覆盖语义
    • ✅ 新增词条
    • ✅ 修改词条内容(包括 plurals 内部 item 修改)
    • ❌ 纯删除(仅 - 行无对应 + 行)—— 按"新增or修改"语义剔除
  4. 去重:同一 name 在多个 locale 文件出现(如 values/ 与 values-zh-rCN/)只保留一次
  5. 顺序:按首次出现顺序输出

边界场景

场景行为
单个 hash正常处理
多个 hash(部分无效)有效的正常处理,无效的跳过并 WARN
全部无效输出空字符串,count=0,列出跳过项
提交无 XML 改动输出空字符串,count=0,无 WARN(不算错误)
Merge commit用 -m --first-parent 取与第一父提交的差异
重复传入同一 hash只算一次(已去重)

不要做的事

  • ❌ 不要尝试自己手写正则或读 strings.xml 文件做解析 —— 直接调用 extract.ps1,它已经处理好了 <plurals> 上下文跟踪、locale 去重、merge commit 等所有边界
  • ❌ 不要在用户没明确给出 commit 时主动用 HEAD —— 应当先询问用户确认要查哪个提交
  • ❌ 不要把 stderr 里 git 的中文报错信息直接抛给用户 —— 脚本已经把异常包装成英文 WARN 了

配套文件

文件说明
SKILL.md本文件,Agent 行为说明
extract.shbash 实现(macOS / Linux / git-bash),首选
extract.ps1PowerShell 实现(Windows 回退)
.gitattributes强制 *.sh 用 LF 行尾,防止 Windows 检出时被改成 CRLF

两个脚本的输出已通过等价性测试(同一 commit 输入 → stdout 字节级一致)。 如需修改提取规则,两个脚本都要同步改,并重新跑一遍等价性对比。脚本顶部的注释已说明这一点。

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐