我们在命令行上使用内部工具来触发 master 分支上的恢复。一个典型的调用就像
$ supertool revert SOME-TICKET
这个 PHP 工具在内部运行
...
$result = shell_exec("git revert -m1 --no-commit <COMMIT HASH>");
...
对于与 SOME-TICKET
关联的所有提交。
我对还原提交的默认提交消息没意见
Revert "<MESSAGE>"
This reverts commit <COMMIT HASH>.
我现在需要做的是向该消息附加一行,使其看起来像:
Revert "<MESSAGE>"
This reverts commit <COMMIT HASH>.
<ADDING A LINE HERE>
如果我在终端中执行 git revert
,会打开一个编辑器,我可以手动编辑提交消息。但是,当另一个程序发出 revert
命令时,我如何在交互式环境中将消息传递给 git revert
?
理想情况下,我们的工具可以shell_exec
这个命令:
$result = shell_exec("git revert -message='...' -m1 --no-commit <COMMIT HASH>");
但我在 git revert
文档中找不到这样的参数 https://git-scm.com/docs/git-revert
有解决办法吗?
最佳答案
当您使用任何基于定序器的命令(还原和 cherry-pick)并使用 --no-commit
时,它们会在 .git/MERGE_MSG
中留下它们的默认消息>,其中 git commit
将选取它以进行进一步编辑。因此可以简单地附加到该文件,然后 git commit --no-edit
结果。
正如您所注意到的,这在任何地方都没有记录,因此将来可能会中断。为避免这种情况,您可能只想生成自己的提交消息。例如,作为一个 shell 脚本,如果你想恢复提交 $H
,添加额外的文本 $extra
:
git revert --no-commit $H
[pause for user interaction as needed/desired]
tmpfile=$(mktemp)
printf >$tmpfile 'Revert %s\n\nThis reverts commit %s.\n\n%s' \
"$(git log --no-walk --pretty=format:%s $H)" \
$H \
"$extra"
git commit -F $tmpfile
rm $tmpfile
(根据需要更喜欢这个,例如,添加陷阱代码以在退出和/或信号时删除临时文件;-t
参数到 mktemp
;和等等)。
请注意,当恢复 merge 时,sequencer.c
代码产生的不仅仅是通常的 This reverts ...
消息:
if (opts->action == REPLAY_REVERT) {
base = commit;
base_label = msg.label;
next = parent;
next_label = msg.parent_label;
strbuf_addstr(&msgbuf, "Revert \"");
strbuf_addstr(&msgbuf, msg.subject);
strbuf_addstr(&msgbuf, "\"\n\nThis reverts commit ");
strbuf_addstr(&msgbuf, oid_to_hex(&commit->object.oid));
if (commit->parents && commit->parents->next) {
strbuf_addstr(&msgbuf, ", reversing\nchanges made to ");
strbuf_addstr(&msgbuf, oid_to_hex(&parent->object.oid));
}
strbuf_addstr(&msgbuf, ".\n");
} else {
当然,如果您选择不依赖 .git/MERGE_MSG
,您也可以遵循这一点。
(顺便说一句,对于所有出现的 .git
,请使用 git rev-parse --git-dir
。)
关于git - 在不打开编辑器的情况下将字符串附加到 git revert 提交消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37605333/