我们在命令行上使用内部工具来触发主分支上的恢复。典型的通话就像
$ 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
,编辑器会打开,我可以手动编辑提交消息。但是,当git revert
命令由另一个程序发出时,如何在交互式环境中将消息传递给revert
?
理想情况下,我们的工具可以shell_exec
此命令:
$result = shell_exec("git revert -message='...' -m1 --no-commit <COMMIT HASH>");
但我在git revert
docs https://git-scm.com/docs/git-revert
有没有解决方法呢?
答案 0 :(得分:2)
当您使用任何基于音序器的命令(还原和挑选)并使用--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
参数;依此类推。)
请注意,在还原合并时,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
。)