将字符串附加到git还原提交消息而不打开编辑器

时间:2016-06-03 03:08:45

标签: git shell

我们在命令行上使用内部工具来触发主分支上的恢复。典型的通话就像

$ 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

中找不到这样的参数

有没有解决方法呢?

1 个答案:

答案 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。)

相关问题