1

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

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

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

4

2 回答 2

3

不幸的是,我认为这是不可能的。您可以自定义 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"

交互式变基不考虑“第三列”,基本上是您选择为某个提交记录的内容,因此最后您可以将交互式变基的输出复制并粘贴到第二个 rebase(您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"

编辑:我几乎忘记了filter-branch重新创建与指定过滤器匹配的每个提交,因此,在编辑之前,您应该将克隆存储库中交互式 rebase 输出的提交列替换为主存储库中的真实提交。它变得比我想象的更乏味。让我们回到简单的事情:我们可以模拟一个交互式变基而不实际调用它。脚本可以改进,但我认为方向是正确的:

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

你这样称呼它

./script HEAD~3

并且您获得交互式变基输出(有点,没有评论)

pick 483ac92 first commit
pick bb739b7 second commit
pick 59f2bf0 very long commit with multiline
于 2021-01-31T19:28:04.720 回答
1

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

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

:!git show 1234abcd

然后,您将看到提交的主题行,这对您来说并没有太多意义,然后是提交消息。

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

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

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

另请参阅关于 Git 提交消息的注释(Tim Pope;2008 年 4 月)。

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

于 2021-01-31T21:47:08.780 回答