I know how to manually split a commit using git rebase -i
, but how can I automatically split every commit in a branch by file?
For instance, commit A
modified 3 files, f1, f2 and f3. After the split, there are 3 commits A-f1, A-f2 and A-f3.
I want to do this to make a major rewriting easier as I will only have to squash some small commits.
For every commit, you would need
first to list all files in that commit
then for each file, extract that file
Do that in a working tree of a dedicated branch, and for every file extracted, add and commit.
Then you can reset your current branch by that new one built commit-file by commit-file.
The Script
The following script splits
HEAD
by file:The generated commit messages are of the form:
Usage
The following assumes that you can run above script as
git-split
.If you want to split all commits in a range by file, use it like this:
If you want to split a single commit during an interactive rebase, use it like this:
Any improvements to the script are welcome.