原创Skill分享:从指定 git 提交中提取所有新增/修改的字符串资源 name,无需手动复制 strings.xml 内容。
·
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
HEAD、HEAD~1、HEAD~3- 分支名 / 标签名
Cursor 当前没有
@commit原生引用语法。最自然的输入方式是直接在对话里写 hash,多个用英文逗号分隔。
执行流程
调用方式(Agent 必读)
平台选择策略
提供 两个等价脚本,输出已经过等价性测试逐字节一致:
| 脚本 | 适用平台 | 优先级 |
|---|---|---|
extract.sh | macOS / Linux / Windows-with-git-bash | 🟢 优先 |
extract.ps1 | 仅 Windows(无 bash 时回退) | 🔵 回退 |
判断逻辑(Agent 按顺序尝试):
- 先试
command -v bash >/dev/null 2>&1,有 bash 就用extract.sh - 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"
注意事项
- 必须在 当前代码 仓库根目录下执行(脚本内部会调用
git) - commits 整体用双引号括起,避免 shell 把空格分开
- 用户原始 hash 直接透传,无需做任何预处理(脚本自己负责解析)
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 需理解)
脚本的提取逻辑:
- 匹配范围:所有路径以
.xml结尾的文件 - 匹配实体:
<string ... name="...">—— 任何+行包含该模式<plurals ... name="...">—— 任何+行包含该模式<plurals>块内部的+<item>—— 取外层 plurals 的 name(处理 plurals 内部 item 修改场景)
- 覆盖语义:
- ✅ 新增词条
- ✅ 修改词条内容(包括 plurals 内部 item 修改)
- ❌ 纯删除(仅
-行无对应+行)—— 按"新增or修改"语义剔除
- 去重:同一 name 在多个 locale 文件出现(如
values/与values-zh-rCN/)只保留一次 - 顺序:按首次出现顺序输出
边界场景
| 场景 | 行为 |
|---|---|
| 单个 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.sh | bash 实现(macOS / Linux / git-bash),首选 |
extract.ps1 | PowerShell 实现(Windows 回退) |
.gitattributes | 强制 *.sh 用 LF 行尾,防止 Windows 检出时被改成 CRLF |
两个脚本的输出已通过等价性测试(同一 commit 输入 → stdout 字节级一致)。 如需修改提取规则,两个脚本都要同步改,并重新跑一遍等价性对比。脚本顶部的注释已说明这一点。
更多推荐



所有评论(0)