这是我之前的问题的概括,旨在提高我对 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:除了编写一个语义上表示“删除以 parent 开头的行
parent
,然后插入以 parent 开头的新行”的 sed 脚本外,我是否可以编写一个 git 命令,表示“将此提交的父级设置为 X、Y、Z”并输出包含该更改的提交?(git replace 可以处理这种情况,但不能处理一般情况。) - 示例 2:除了编写一个基于正则表达式识别提交消息并替换它的 sed 脚本外,我是否可以编写一个 git 命令,说“将此提交的提交消息设置为‘hello world’”并输出包含该更改的提交?
提出这个问题的部分动机是出于求知欲;另一部分动机是,如果尚不存在这样的工具,我正在考虑在外部构建它(通过包装文本操作)。
git commit-tree
从树中创建提交对象。提交消息可以通过 stdin 或-m
选项提供。/-S
允许--gpg-sign
签署新的提交对象。设置GIT_AUTHOR_DATE
和GIT_COMMITTER_DATE
分别指定作者和提交者时间。例子:
要重新使用/修改现有提交的消息,请通过 stdin 提供:
例如,将“圣诞快乐!”附加到提交的消息中:
如果您需要从原始提交中复制提交者/作者日期/姓名/电子邮件,请从原始提交中获得的信息填充环境变量: