问题描述
当您 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 来改写那些提交消息,它们的主题行在他们首先做之前不会对你说太多。