这个函数最后是谁改的sem blame实体级代码溯源完全指南【免费下载链接】semSemantic version control entity-level diffs, blame, and impact analysis on top of git. 28 languages via tree-sitter. Built for coding agents.项目地址: https://gitcode.com/gh_mirrors/sem7/sem当线上出问题时你问的第一个问题往往是“这个函数最后是谁改的为什么”。传统git blame只能逐行回答而函数被反复重构后行级信息支离破碎。sem是一个构建在 Git 之上的语义化版本控制Semantic Version Control工具它的sem blame命令把溯源粒度从“行”提升到“函数、类、方法”等代码实体一句话告诉你这个函数最后的修改人。本文带你从零上手 sem blame搞懂实体级代码溯源的用法与原理。一、为什么行级 blame 不够用 想象一个被三个人在八个月内各自动过的authenticateUser函数对比git blame行级sem blame实体级溯源粒度每一行一个提交整个函数一个“最近修改”结论重构后体验行散落几十个提交无法判断扫描函数全部行取最新一次提交未提交改动只有个别行有标记整个函数标记为Not Committed YetAI Agent 消费大量行级噪音、费 token结构化 JSON直接可读sem 的核心思路是 README.md 开篇那句话告诉你function was modified而不是lines x-y changed。二、一分钟上手 sem blame安装与第一条命令1. 安装 sem任选其一# Homebrew brew install sem-cli # npm 包装器项目内安装用 npx sem 调用 npm install --save-dev ataraxy-labs/sem # 从源码构建需要 Rust 工具链 git clone https://gitcode.com/gh_mirrors/sem7/sem cd sem cargo build --release # 产物在 target/release/sem装好后确认版本sem --version。2. 跑通你的第一条实体级溯源在任意 Git 仓库里只需一条命令sem blame src/auth.tssem 会自动解析文件、提取全部实体并输出每个函数、类的“最后是谁改的”三、sem blame 的工作原理从“行”到“函数”整个流程在 blame.rs 中实现分三步没有任何隐藏索引任何仓库开箱即用。1. 第一步tree-sitter 提取代码实体sem 用 tree-sitter 解析目标文件把每个函数、类、方法识别为一个“实体”并记录其行号范围见 blame.rs 的extract_entities调用。官方支持32 种编程语言Python、TypeScript、Go、Rust、Java 等加 JSON/YAML/TOML/Markdown 等结构化格式完整清单见 README.md。2. 第二步git blame 提供行级数据底层直接调用git blame --line-porcelain拿到该文件每一行的提交、作者和时间戳实现见 bridge.rs。也就是说sem 不重新发明轮子git 依然是事实来源。3. 第三步聚合出“这个函数最后是谁改的”对每个实体sem 扫描它覆盖的所有行取提交时间最新的那一次作为实体的最后修改记录如果范围内有任何一行尚未提交则整个实体直接标记为未提交逻辑见 blame.rs。⚡ 这个“整函数看待未提交改动”的细节有专门的回归测试兜底blame_cli.rs 断言只要函数内有一行未提交JSON 输出里author就是Not Committed Yet、commit为null。四、输出长什么样两种格式看懂结果终端表格人看实体类型、名称、8 位提交号、作者、日期、提交说明一栏对齐顶层实体用⊕标记、嵌套实体用└缩进一眼看清类里哪个方法刚被动过┌─ src/auth.ts │ │ ⊕ function authenticateUser 3fa8c1d2 alice 2026-09-12 fix: reject empty token │ └ method validateToken 9c2e4410 bob 2026-08-30 refactor: extract helper │ └────────────────────────────────────────────────────────────JSON脚本和 AI Agent 看sem blame src/auth.ts --json[ { name: authenticateUser, type: function, lines: [12, 48], author: alice, date: 2026-09-12, commit: 3fa8c1d2, summary: fix: reject empty token } ]字段含义lines是实体的起止行commit为null表示该实体含未提交改动。命令速查见 docs/llms.txt。五、进阶把 sem blame 串进完整的代码考古链路sem blame只回答“最后是谁改的”sem 家族里还有两个天然搭档命令回答的问题sem blame src/auth.ts每个函数最后是谁改的sem log authenticateUser这个函数在整个历史中如何演化含-v查看版本间内容 diffsem impact authenticateUser改它会波及哪些调用方和测试实现分别位于 log.rs 和 impact.rs。另外如果你在用 AI 编码代理sem mcp会启动一个 MCP 服务器代理可直接调用sem_blame、sem_impact、sem_context等 8 个实体级工具——问“改这个函数会坏什么”拿到的就是确定性的依赖图答案而不是一堆 grep 结果见 README.md。六、常见问题 ❓需要先建索引吗不需要。sem blame对单文件即时解析 即时 blame任何 Git 仓库零配置可用。未提交改动会怎样实体含未提交行时整体标记Not Committed Yet提交号显示uncommtd不会误报历史提交。支持什么语言32 种主流语言全覆盖Python、Go、Rust、TypeScript、Java 均在列非标扩展名可在项目根写.semrc映射。和 GNU Parallel 的sem冲突若sem --version显示不对把~/.cargo/bin或 Homebrew 的 bin放到 PATH 前面即可详见 README.md。只看 blame 还不够想按函数审 diff用sem diff它输出“哪个函数被改了/改名/移动”还能--format markdown直接贴进 PR。七、总结让“这个函数最后是谁改的”成为一秒钟的问题sem blame 把git blame的行级噪音聚合成实体级结论一行命令知道每个函数、类的最后修改人、时间和提交说明。它零配置、支持 32 种语言、原生输出 JSON 供 AI Agent 消费还和sem log、sem impact、sem diff组成完整的语义化版本控制闭环。从“翻几十条行级记录”到“看一眼实体表格”这就是实体级代码溯源的价值。【免费下载链接】semSemantic version control entity-level diffs, blame, and impact analysis on top of git. 28 languages via tree-sitter. Built for coding agents.项目地址: https://gitcode.com/gh_mirrors/sem7/sem创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
