是否有Git原生非交互式修改提交元数据且不碰工作树的方法?
结构化修改Git提交元数据的探讨
这是我此前问题的泛化,旨在加深对Git内部可执行与不可执行操作的理解。
需求说明
假设我有提交A,希望修改其任意元数据(包括父提交、树对象、作者/提交者信息、作者/提交日期、提交说明或GPG签名),生成新提交B——B除修改部分外,其余元数据与A完全一致。此外,修改过程无需创建新树对象,要么沿用原树,要么替换为另一已存在的树对象。
已知实现方法
- 执行
git checkout A后,搭配各类选项使用git commit --amend。这是Git原生方法,修改灵活性尚可,但属于交互式操作且会改动工作树。 - 使用
git cat-file | <insert_sed_script> | git hash-object -w -t commit --stdin,正如我此前问题的某回答所述。
第二种方法符合我的语义需求,但需要依赖外部脚本处理提交的文本表示。
核心疑问
当前非交互式转换提交对象是否只能通过文本处理实现?是否存在更结构化、语义化的提交元数据操作方式?
具体示例
- 示例1:能否不用编写sed脚本(语义为“删除以
parent开头的行,再插入新的parent行”),而是通过Git命令直接“将该提交的父提交设置为X,Y,Z”并输出修改后的提交?(git replace仅能处理此特例,无法覆盖通用场景。) - 示例2:能否不用编写sed脚本通过正则识别并替换提交信息,而是通过Git命令直接“将该提交的提交信息设置为"hello world"”并输出修改后的提交?
提问动机
我提出此问题部分是出于求知欲,另一部分是若此类工具不存在,我考虑基于文本处理封装一个外部工具。
内容的提问来源于stack exchange,提问作者merlin2011
相关产品推荐
相关产品推荐

