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

Posted

技术标签:

【中文标题】如何在 git-rebase TODO 编辑器会话中查看更多日志行?【英文标题】:How can I see more log lines in the git-rebase TODO editor session? 【发布时间】:2021-01-31 15:51:19 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

git config rebase.instructionFormat "..."

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

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 选项中,我没有看到任何可以用其他东西替换换行符的东西,或者干脆忽略它。

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

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

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

不管怎样,我刚刚找到了一个和你类似的question。


编辑: 如果您想要另一个工具来处理新提交消息的格式,您可以随时创建一个脚本,例如用 \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 重新创建与指定过滤器匹配的每个提交,因此,在编辑之前,您应该将克隆存储库中交互式变基输出的提交列替换为主存储库中的真实提交。它变得比我想象的更乏味。让我们回到简单的事情:我们可以模拟一个交互式变基而不实际调用它。脚本可以改进,但我认为方向是正确的:

#!/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

然后您获得交互式 rebase 输出(有点,没有 cmets)

pick 483ac92 first commit
pick bb739b7 second commit
pick 59f2bf0 very long commit with multiline

【讨论】:

首先,+1 感谢您对此的努力 :-) 现在,有没有办法将一些格式传递给外部命令?也许可以使用它来删除换行符或插入注释起始字符。 这是一个有趣的问题,我绝对没有浪费时间 :) --msg-filter 选项执行一个脚本,接受旧的提交消息作为输入,并返回新的提交消息作为输出。我正在编辑 使用另一种可能且更简单的解决方案进行编辑。【参考方案2】:

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

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

:!git show 1234abcd

然后你会看到提交的主题行,它对你没有什么意义,然后是提交信息。

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

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

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

另请参阅 A Note About Git Commit Messages(Tim Pope 撰写;2008 年 4 月)。

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

【讨论】:

以上是关于如何在 git-rebase TODO 编辑器会话中查看更多日志行?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Pycharm 不突出 TODO 的?

将TODO添加到外部组织文件。

Kotlin Compose 终结toDo项目 点击可以编辑修改todo

如何在 powershell 远程会话(powershell)中编辑文件

vsCode安装todo插件

如何使用 QPlainTextEdit 编辑器结束编辑会话?