The Script
The following script splits HEAD
by file:
#!/usr/bin/env bash
set -e
SHA=$(git rev-parse --short HEAD)
# Change to repo root directory
cd $(git rev-parse --show-toplevel)
git reset HEAD^
git diff-tree --no-commit-id --name-only -r $SHA | while read -r f; do
git add "$f"
GIT_EDITOR="echo '0a\n$SHA $f\n\n.\nw' | ed -s" git commit -c $SHA
done
The generated commit messages are of the form:
<original SHA> <file name>
<original commit message>
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:
git rebase --interactive --exec git-split <branch>
If you want to split a single commit during an interactive rebase, use it like this:
p Commit to split
x git-split
Any improvements to the script are welcome.