Re: Programmatically edit the git rebase sequence?
From: Johannes Schindelin <hidden>
Date: 2026-07-08 17:58:35
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.
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
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