git - 在不打开编辑器的情况下将字符串附加到 git revert 提交消息

标签 git shell

我们在命令行上使用内部工具来触发 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/

相关文章:

git - 我似乎有太多远程分支。这怎么发生的?我如何解决它?

裸存储库上的 Git 子树更新

linux - 在 git init 上自动添加 Remote

shell - 在 shell 脚本中捕获 mysql 输出

python-3.x - 如何监视Docker卷使用情况?

git clone 很慢 - 我可以将现有的克隆复制到新目录吗?

android - 如何在SourceTree中自动创建标签

macos - 从终端 (osx) 中删除 "do you want to close this window"消息

linux - 同步: dont delete few files in source after upload

linux - 检查脚本是否正在运行并启动它的脚本,如果它已停止