AI PLAY玩法更新持续收录
← 回到更新流

2026-09-14 · 原文发布日

commit-rewriter:批量改写提交信息的小工具

Simon Willison发布的小工具commit-rewriter 0.1:一个Python网页应用,用来批量编辑Git仓库的提交信息。缘起是他给Datasette安全发布整理提交记录时,原始提交里混着编程代理留下的杂物和私有仓库的issue编号,不适合公开。运行uvx commit-rewriter即可启动,提交修改前工具会先为当前状态建带时间戳的备份分支,再重写从你编辑的最早一条到最新的所有提交。

原文要点

Simon Willison发布commit-rewriter 0.1,一个Python网页应用,用于批量编辑Git仓库提交信息。缘起是他为Datasette安全发布整理提交记录时,原始提交混有编程代理留下的杂物和私有仓库issue编号,不适合公开。用法是在仓库目录运行uvx commit-rewriter(可带仓库路径);提交修改时工具会先为当前状态建带时间戳的备份分支,再重写从被编辑的最早一条到最新的所有提交。原文未给出网页界面细节、命令参数列表或依赖说明。

这次做成什么

用一个隔离的练习仓库走完'启动工具→网页里批量改提交信息→提交→验证重写结果与备份分支'的完整流程。因原文未附界面截图,网页内的具体按钮与字段名以实际打开后为准,本站只给出可核对的流程与练习材料。

准备什么

  • 已安装uv(能提供uvx命令)的Python环境,能联网让uvx拉取commit-rewriter包
  • 一个用于练习的Git仓库副本,绝不在尚未推送备份的唯一工作仓库上直接试
  • 会用git log、git branch等基本命令来核对重写结果

具体怎么做

  1. 造一个安全的练习仓库

    新建空目录,git init后按下方材料脚本生成五条带'杂物'的提交(含编程代理口吻和私有issue编号),确认git log --oneline显示五条记录,这样即使重写失败也毫无损失。

  2. 启动网页应用

    在练习仓库目录内运行 uvx commit-rewriter(或在任意目录运行 uvx commit-rewriter path/to/repo 并替换为实际路径),终端会给出本地网页地址,用浏览器打开。界面细节原文未描述,以实际页面为准。

  3. 在网页里批量编辑提交信息

    在页面中逐条修改提交信息:删掉代理生成的冗余描述、把形如PROJ-417的私有issue编号改为公开说明或删除,保留技术变更的实质内容。改动完再统一提交,不要边改边提交。

  4. 提交并核对重写范围

    提交编辑后,工具先创建带时间戳的备份分支,再重写从你编辑过的最早一条到最新的全部提交。回到终端运行git log检查新信息,运行git branch确认备份分支存在;若想还原,切回该备份分支即可。

  5. 理解重写范围的边界

    注意重写是从被编辑的最早一条开始重写到最新提交,意味着即使只改倒数第三条,其后两条提交的哈希也会变化;已推送到共享远程的提交历史被重写后需要强推,团队仓库慎用。

可直接复制的材料

生成练习仓库的Shell脚本(本站示例)

本站独立设计的练习脚本,在空目录执行即可;与作者的Datasette仓库无关。

mkdir commit-practice && cd commit-practice
git init -b main
echo "v1" > app.py && git add . && git commit -m "WIP: agent draft, refs PROJ-417, fix stuff"
echo "v2" > app.py && git add . && git commit -m "checkpoint (Claude session): partial login fix PROJ-418"
echo "v3" > app.py && git add . && git commit -m "more changes, see internal ticket PROJ-419"
echo "v4" > app.py && git add . && git commit -m "agent: cleanup temp files"
echo "v5" > app.py && git add . && git commit -m "final tweaks before release"
git log --oneline

改写前后对照练习表(本站示例)

本站虚构的练习改写方案,演示去掉代理痕迹与私有编号的改写原则。

{"rewrite_plan":[{"before":"WIP: agent draft, refs PROJ-417, fix stuff","after":"修复登录页空密码导致的500错误"},{"before":"checkpoint (Claude session): partial login fix PROJ-418","after":"补全登录失败时的错误提示文案"},{"before":"more changes, see internal ticket PROJ-419","after":"为登录接口补充速率限制"},{"before":"agent: cleanup temp files","after":"移除调试用的临时文件"},{"before":"final tweaks before release","after":"发布前更新版本号与变更日志"}]}

输入与输出示例

本站虚构演示,未实际运行该工具,分支名格式与哈希变化为基于原文描述的推断示意,以实际行为为准。

输入

对练习仓库中倒数第三条提交'agent: cleanup temp files'执行改写,改为'移除调试用的临时文件',其余四条不改动,然后在网页中提交编辑。

对应输出

提交后示意:git branch显示形如backup-20260914-123000的时间戳分支;git log显示最近三条提交哈希全部更新(因为重写在倒数第三条处开始),最早两条哈希保持不变;最近三条信息依次为'移除调试用的临时文件''发布前更新版本号与变更日志'等新文本。

做完检查这些

  • 提交编辑后git branch列表里出现一条带时间戳的新备份分支
  • git log中被编辑的最早一条及其之后的提交哈希全部变化,之前的提交哈希不变
  • 新提交信息中不再出现PROJ开头的私有编号和代理会话痕迹
  • 切到备份分支后能看到重写前的原始提交历史,可随时还原

容易卡住的地方

  • 原文称'重写从你编辑的最早一条到最新的所有提交',只想改历史中段一条时其后所有提交哈希也会变,已推送共享远程需强推
  • uvx首次运行需联网拉取包,离线环境无法直接启动
  • 原文未说明对合并提交、签名提交的处理方式,含此类提交的仓库先在副本上验证
  • 备份分支只是安全网,若在重写后又基于新历史做了提交,还原时需要手动处理分叉

原文与作者资料 ↗

本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。

原文标题
commit-rewriter 0.1
原作者
Simon Willison
原始发布日期
2026-09-14
来源
https://simonwillison.net/2026/Sep/14/commit-rewriter/