git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Programmatically edit the git rebase sequence?

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Jul 8, 2026, 17:58 UTC
Message-ID
<32e8c83a-69f3-8ef3-8d9c-f9860fda2fbb@gmx.de>
In-Reply-To
<akei64goQf3nFhX4@hikari>
Hi Matthias,
On Fri, 3 Jul 2026, Matthias Beyer wrote:
> in a recent conversation at work, the question of how to
> programmatically edit the git-rebase sequence came up.

The easiest way is probably to have the interactive rebase stop at the top of the rebase script:

	# insert a `b` (for `break`) before the first line
	GIT_SEQUENCE_EDITOR="sed -i 1ib" git rebase -i ...

(Note that this is GNU sed syntax, with BSD/macOS sed you'll have to get a bit creative, or write a real script and refer to it via the path.)

Then you can use a script to transform the rebase script before `git rebase --continue`.

I frequently use this technique with LLMs because they seem to be unable to control an interactive editor correctly.

Show 8 quoted lines
> I have a branch that touches a number of files, adds some files and
> removes some files.
> When rebasing, I want to split all commits that touched a certain subset
> of files, for the clearity of the history.
> 
> I look at the output of
> 
>     git log master..mybranch --oneline --diff-filter=M -- "./subdir/*.rs"

Noting that the OIDs in $(git rev-parse --git-path rebase-merge/git-rebase-todo) are expanded, you could match them via the OIDs obtained using `rev-list` instead of `log`, to enumerate the OIDs instead of full commit history, then turning that into some kind of regex. Something along the lines

	regex=$(git rev-list master..mybranch --diff-filter=M -- "subdir/*.rs" |
		# read all lines, then turn newlines into `\|`
		sed ':1;$b2;N;b1;:2;s/\n/\\|/g')
	GIT_REBASE_TODO="$(git rev-parse --git-path rebase-merge/git-rebase-todo)"
	test -z "$regex" ||
	sed -i "s/^pick \($regex\)/edit \1/" $GIT_REBASE_TODO

This _should_ work, but you'll most likely want to adapt it to your particular use cases.

Ciao, Johannes

Show 21 quoted lines
> 
> to find all commits in that subdir that only touched the files. All of
> these commits are to be "edit"ed.
> 
> Now I fire up `git rebase -i master` and manually(!) match the list from
> above `git-log` call and find the respective commits to edit them.
> 
> Is there a way I am not aware of to do that manual step programatically?
> Something like
> 
>     git rebase -i master --edit-commits="$(git log master..mybranch --diff-filter=M --format="%H" -- "./subdir/*.rs")"
> 
> would be convenient here, although I would understand if that is too
> much clutter for the already very heavy git CLI interface :-)
> 
> Maybe I am just not aware of the obvious solution - I would be happy to
> learn that there is already one!
> 
> Best,
> Matthias
> 
Previous: D. Ben Knoble
Message 6 of 6 in “Programmatically edit the git rebase sequence?”
  1. Matthias BeyerJul 3, 2026
  2. Michal SuchánekJul 3, 2026
  3. brian m. carlsonJul 3, 2026
  4. Matt HunterJul 3, 2026
  5. D. Ben KnobleJul 3, 2026
  6. Johannes SchindelinJul 8, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.