如何在 git-rebase TODO 编辑器会话中看到更多日志行?

问题描述

当您 git rebase -i 1234abcd 时,您会获得一个编辑器会话,其中包含 rebase 的“Todo”列表:每个相关变更集需要做什么。

现在,认情况下,我们每次提交都会看到一行 - 提交消息的第一行。然而,我们中的一些人编写了多行提交消息,其中第一行并没有说太多。

是否有可能在 Todo 编辑器中以某种方式让 git 从附加行打印内容?我不介意确切的格式,我只需要区分不同的提交即可知道我在做什么。

解决方法

不幸的是,我认为这是不可能的。 您可以自定义 rebase 输出的唯一方法是通过 rebase.instructionFormat 配置,如下所示:

git config rebase.instructionFormat "..."

我也尝试使用选项 %B 来返回带有正文的主题,但 rebase 操作失败并出现以下错误:

error: invalid line 5: second line
error: invalid line 7: third line
error: invalid line 8: forth line
BUG: builtin/rebase.c:353: unusable todo list
Aborted (core dumped)

似乎 git 将第一行之后的行视为可执行代码。 我查看了 git log 文档,但在 --format 选项中,我没有看到任何可以用其他内容替换换行符或直接忽略它的内容。

此时,您可以克隆您的存储库,例如运行 git filter-branch 以用空格替换换行符,并最终运行 git rebase -i

git filter-branch --msg-filter "xargs echo"

交互式变基不考虑“第三列”,基本上是您选择为某个提交记录的内容,因此最后您可以将交互式变基的输出复制并粘贴到第二个存储库(您{ {1}}ed) 在主存储库的编辑器中。

无论如何,我刚刚发现了一个与您相似的 question


编辑: 如果你想要另一个工具来处理新提交消息的格式,你可以随时创建一个脚本,像这样用 filter-branch

替换换行符
\n

并在 #!/bin/bash cat | sed ':a;N;$!ba;s/\n/\\n/g' 选项中调用它

--msg-filter

编辑:我差点忘了 git filter-branch --msg-filter "cat | $(pwd)/script.sh" 会重新创建与指定过滤器匹配的每个提交,因此,在编辑之前,您应该将克隆存储库中交互式 rebase 输出的提交列替换为主中的真实提交回购。它变得比我想象的更乏味。让我们回到简单的事情:我们可以模拟交互式 rebase,而无需实际调用它。脚本可以改进,但我认为方向是正确的:

filter-branch

你这样称呼它

#!/bin/bash
for commit in $(git rev-list $1..HEAD | tac)
do
    git log -n 1 $commit --format="pick %h %B" | xargs echo
done;

并且您获得交互式 rebase 输出(有点,没有注释)

./script HEAD~3
,

然而,我们中的一些人编写了多行提交消息,其中第一行并没有说太多。

该行旁边是缩写的修订哈希。鉴于您使用的是 vim 或兼容,只需输入命令:感叹号 git space show space hash 并按 Enter:

:!git show 1234abcd

然后你会看到提交的主题行,它对你来说没什么意思,然后是提交消息。

如果提交消息的正文不够,这还将显示更改的路径和更改的差异。

如果您使用不同的编辑器,请查看有关如何在编辑器中执行 shell 命令的文档。在交互式地重新变基时,工作目录是 git 存储库的工作树的根目录,当前交互式变基是从其中启动的。

存在其他工具,例如您可能希望在另一个窗口中打开 gitk 来指导您的交互式变基。按 g 输入修订版并跳转到该修订版。

另见 A Note About Git Commit Messages(由 Tim Pope 撰写;2008 年 4 月)。

提示:考虑使用交互式 rebase 来改写那些提交消息,它们的主题行在他们首先做之前不会对你说太多。