git rebase --editor=/something/other/than/vim?(用于更轻松地压缩)

67

我很高兴地将vim作为我的默认提交编辑器,不希望更改它。然而,当涉及到变基时,我发现自己需要将几十个提交压缩成一个,并且使用Textwrangler这样的交互式编辑器会更容易(在除了最上面的提交之外的所有提交中用“squash”替换“pick”)。

有没有办法为一次性变基命令指定替代编辑器?

我知道在vim中我可以这样做:

:%s/pick/squash/

但这也有一些小烦恼。

编辑 - 如评论中所述,您可以通过转到第二行并执行操作来非常有效地压缩除顶部提交之外的所有内容。

:,$s/pick/squash/

(请注意,逗号和美元符号与原来的不同)


5
在vim中,你可以执行:,$s/pick/squash/命令来将当前行到文件末尾的所有出现的单词"pick"替换为"Squash"。 - Greg Hewgill
这是一个很好的提示,谢谢 Greg。是的,那就是我所提到的“小烦恼”。 - Sridhar Sarnobat
假设您拥有最新的vim版本或已安装了Tim Pope的vim-git插件,您可以使用:Cycle:Squash命令。您甚至可能想使用映射。也许使用:global命令::+,$g/./Squash - Peter Rincker
请问 :Cycle 和 :Squash 是做什么用的?我找不到这些命令的文档。 - Sridhar Sarnobat
我也经常使用“标记”。转到您想要更改的第一行,键入ma(设置标记a),转到最后一个要更改的行,键入:'a,.s/this/that/。单引号后跟标记字母表示“设置该标记的行”。 - torek
显示剩余2条评论
4个回答

79
尝试在命令前添加 GIT_EDITOR 环境变量,像这样:
GIT_EDITOR=<editor of choice> git rebase <...>
例如,要使用nano,我会输入:
GIT_EDITOR=nano git rebase -i abcdef1234

由于您没有导出它,那个变量的值在命令终止时会被重置吗?(那将是理想的,但我猜您需要手动重置它) - Sridhar Sarnobat
1
该变量仅在该命令调用期间设置。尝试再次运行 git rebase,不使用 GIT_EDITOR,您将再次使用默认编辑器。 - Rob Bajorek
很好,这就是正确的答案。尽管我认为对学习更多vim的恐惧有些不必要。 - Sridhar Sarnobat
1
确实很棒。由于某种原因,我的古老服务器端操作系统默认使用 vi 而不是 vim -- 所以现在我知道如何永久修复这个问题了。 - MarkHu
对于Visual Code,请使用GIT_EDITOR="code --wait" git rebase -i abfa452 - EddyXorb
显示剩余2条评论

18

所有交互式变基的最佳选择是使用https://github.com/sjurba/rebase-editor,它是一个专为交互式变基编写的自定义CLI应用程序,使用Node编写。

安装方法:

npm install -g rebase-editor
git config --global sequence.editor rebase-editor 

或者使用 yarn:

yarn global add rebase-editor
git config --global sequence.editor rebase-editor 

4
这个工具真的很棒。 - Antony Stubbs
这个工具现在是我设置的必需部分。能够用单个按键选择每个操作,使“git rebase”成为可教授的过程。 - Dan Ciborowski - MSFT
我去查看这个工具的文档,打算使用它,但不幸的是它不能在Windows上的git-bash中使用(https://github.com/sjurba/rebase-editor/issues/7)。 尝试了hack git config --global sequence.editor 'winpty rebase-editor.cmd',但对我来说没有用。现在没法花太多时间在这上面,所以暂时只能使用gitbash上的vim编辑器。 - Afshar

1
在 Git 2.40(2023 年第一季度)中,就像 "git var GIT_EDITOR"(man)" 抽象出了其背后复杂的逻辑以选择使用哪个编辑器一样,"git var" 现在也支持 GIT_SEQUENCE_EDITOR
查看提交4c3dd93(2022年12月17日)由Sean Allred(vermiculus进行。
(由Junio C Hamano -- gitster --提交48475f4中合并,2022年12月28日)

var:添加GIT_SEQUENCE_EDITOR变量

已签署:Sean Allred

Git 在编辑序列器 "todo" 文件时使用的编辑器程序是通过检查一些环境变量并受配置变量的影响来确定的。介绍 "git var GIT_SEQUENCE_EDITOR"(man),使用户可以访问逻辑的最终结果,而不必知道确切的细节。这在精神上与 44fcb49 (Teach git var about GIT_EDITOR, 2009-11-11, Git v1.6.6-rc0 -- merge) 非常相似,该版本引入了 "git var GIT_EDITOR"。

git var现在在其手册页面中包含以下内容:

GIT_SEQUENCE_EDITOR

用于编辑运行git rebase -i时的“todo”文件的文本编辑器。与GIT_EDITOR类似,该值在使用时应由shell解释。

首选顺序如下:

  • 环境变量$GIT_SEQUENCE_EDITOR,然后
  • sequence.editor配置,然后
  • git var GIT_EDITOR的值。

1
在我的情况下,我为rebase设置了一个交互式编辑器。然而,我发现它不能做我想要的事情,所以在我想要指定替代编辑器进行偶尔调用的情况下,可以使用以下方法:
git -c sequence.editor=vim rebase -i upstream/main

-c sequence.editor=<value> 这个命令可以设置 sequence.editor 配置键的值。你可以在任何命令中使用这个语法,有时候非常方便。


对于vscode来说,这个命令简直太好用了,谢谢:git -c sequence.editor="code --wait" rebase -i --autostash origin/dev - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接