How to suppress the editor for `git rebase --continue`?
Asked Answered
F

2

75

I'm often rebasing interactive to make tiny changes in the history (for example removing a blank line, or editing one line). In most cases those changes are based on some peer review.

At first I do my change like that:

git rebase --interactive 83bbeb27fcb1b5e164318fa17c55b7a38e5d3c9d~
# replace "pick" by "edit" on the first line
# modify code
git commit --all --amend --no-edit
git rebase --continue

If there are merge conflicts in one of the following commits, I resolve them and do this:

git rebase --continue
# the commit message is shown, but does not have to be changed, so I just save and exit the editor
git rebase --continue
# the commit message is shown, but does not have to be changed, so I just save and exit the editor
git rebase --continue
# the commit message is shown, but does not have to be changed, so I just save and exit the editor
...

Is there anything like a --no-edit argument to git rebase --continue that avoids the editor (similar to git commit)?

Fm answered 19/4, 2017 at 8:6 Comment(3)
Set your preferred editor to a does-nothing-and-succeeds command, such as true. Git will invoke it, it will do nothing and succeed, and Git will re-use the existing commit message. Hence: GIT_EDITOR=true git rebase --continue.Iatrics
@Iatrics Is there a way to apply the change of the editor to only one git command? I tried ; (like that: GIT_EDITOR=true;git rebase --continue), but that did not work. (I'm using a mac, btw)Fm
That (environment setting via shell VAR=val cmd...) does affect just the one command, plus anything it runs itself. To affect multiple commands you must set the variable and "export" it, which in most shells is export VAR=value; command1; command2; ...Iatrics
A
76

First approach, through Git configuration:

git -c core.editor=true rebase --continue

Or, with environment variables:

GIT_EDITOR=true git rebase --continue

This will override the editor that git uses for message confirmation. true command simply ends with zero exit code. It makes git continue rebase as if user closed interactive editor.

On Windows, you would need to use CMD /V /C

cmd /V /C "set "GIT_EDITOR=true" && git rebase --continue

In both OS, you can use aliases

# Linux
alias grc='GIT_EDITOR=true git rebase --continue'

# Windows
doskey grc=cmd /V /C "set "GIT_EDITOR=true" && git rebase --continue"

Then a simple grc will be enough to continue the rebase without the editor popping up.


David Gardiner adds in the comments:

In PowerShell, use:

$env:GIT_EDITOR = "true -and git rebase --continue"

then tidy up with

 $env:GIT_EDITOR = ""

To set that globally (without alias), maybe consider this approach:

specifying the core.commentChar detected from the .git/rebase-merge/message (here @):

git --global core.commentChar @

There is also GIT_SEQUENCE_EDITOR=:, but you cannot always leave it at that value, because that would break all the rebase operation where you want an editor.

That is why having an alias remains the most flexible and accurate approach, rather than relying on a global setting which might break other rebase editor use cases.

Aspasia answered 20/8, 2017 at 15:33 Comment(7)
Setting env var like var=val works only for shell. In order to make ti work for all processes that will be started after that you need to call export var. Doing everything as single command can be export var=val. But it would be bad idea to override GIT_EDITOR for all other invocations of git. So the final recommendation (var=val command) is the best one because it has no negative side effect.Agrarian
@VictorYarema Thank you for the comment and the edit: this answer is clearer now, thanks to you.Aspasia
Is there a way to config it globally? I know it's possible because this is how it worked on my old computer..Coleville
@MoshFeu Maybe this: https://mcmap.net/q/270695/-git-rebase-continue-without-opening-the-editorAspasia
Thanks! I will check itColeville
In PowerShell, use: $env:GIT_EDITOR = "true -and git rebase --continue", then tidy up with $env:GIT_EDITOR = ""Maxinemaxiskirt
@DavidGardiner Thank you for your feedback. I have included your comment in the answer for more visibility.Aspasia
B
20

The trick of using true as an editor can also be accomplished with a git alias like this:

[alias]
    continue = "-c core.editor=true rebase --continue"

Then you use git continue instead of git rebase --continue.

Bolero answered 2/12, 2021 at 19:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.