当你使用git rebase -i 1234abcd时,你会得到一个编辑器会话,其中包含“TODO”列表,用于rebase:对于每个相关的变更集需要做什么。
现在,默认情况下,我们每次提交都会看到一行--提交消息的第一行。然而,我们中的一些人编写了多行提交消息,其中第一行没有说太多。
有没有可能通过某种方式让git在TODO编辑器中打印额外行的内容?我不介意确切的格式,我只需要区分不同的提交来知道我在做什么。
发布于 2021-02-01 03:28:05
不幸的是,我认为这是不可能的。定制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不考虑“第三列”,基本上就是您选择记录某个提交的内容,所以在最后,您可以在主repo的编辑器中将交互式rebase的输出复制并粘贴到第二个repo (您使用filter-branch编辑的那个)上。
不管怎样,我刚找到一个和你的相似的question。
编辑:如果您想要另一个工具来格式化新的提交消息,您总是可以创建一个脚本,就像下面这样用\n替换换行符
#!/bin/bash
cat | sed ':a;N;$!ba;s/\n/\\n/g'并将其称为inside --msg-filter选项
git filter-branch --msg-filter "cat | $(pwd)/script.sh"编辑:我几乎忘记了filter-branch会重新创建与指定过滤器匹配的每个提交,因此,在编辑之前,您应该用主存储中的真实提交替换克隆存储库中交互式rebase输出的提交列。它变得比我想象的更乏味。让我们回到简单的事情上:我们可以模拟一个交互式的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并获得交互式的rebase输出(某种程度上,没有注释)
pick 483ac92 first commit
pick bb739b7 second commit
pick 59f2bf0 very long commit with multiline发布于 2021-02-01 05:47:09
然而,我们中的一些人编写了多行提交消息,其中第一行没有说太多。
该行旁边是缩写的修订版散列。假设您使用的是vim或兼容的,只需输入命令:感叹号、git空格、显示空格、散列并按回车键:
:!git show 1234abcd然后,您将看到提交的主题行,这对您来说并不重要,然后是提交消息。
如果提交消息的正文不够,这还将显示更改的路径和更改的差异。
如果您使用的是其他编辑器,请查看有关如何在编辑器中执行shell命令的文档。在交互式rebase时,工作目录是启动当前交互式rebase的git存储库的工作树的根目录。
存在其他工具,例如,您可能想要在另一个窗口中打开gitk来引导您的交互式rebase。按g键输入修订并跳转到该修订。
另请参阅A Note About Git Commit Messages (由Tim Pope撰写;2008年4月)。
提示:考虑使用交互式rebase重新编写这些提交消息,它们的主题行不会对您产生太大影响,直到它们第一次这样做。
https://stackoverflow.com/questions/65981098
复制相似问题