Nothing has been created for this; you will have to write your own script.
, git rev-list git log ( , ), , . , -- . , , feature target, :
git rev-list --reverse --topo-order target..feature > /tmp/list
SHA-1 . , , :
while read sha1; do
author_name=$(git log -n 1 --format=%an $sha1)
...
done < /tmp/list
, , , . $author_name , , , ( ), , . , ... . , target. .
, : - , git commit-tree, .
, :
make_squash_commit() {
local sha1=$1 tree new_sha1
tree=$(git rev-parse $sha1^{tree})
new_sha1=$(git commit-tree $tree -p HEAD)
git update-ref -m "squash $sha1" HEAD $new_sha1
}
set -e
git rev-list --reverse --topo-order target..feature > /tmp/list
git checkout --detach target
: > /tmp/accum_log
prev_sha1=""
while read sha1; do
author_name=$(git log -n 1 --format=%an $sha1)
if [ "$author_name" != "$prev_name" -a -n "$prev_sha1" ]; then
make_squash_commit $prev_sha1 < /tmp/accum_log
: > /tmp/accum_log
fi
prev_name="$author_name"
prev_sha1=$sha1
git log -n 1 --format="%B" $sha1 >> /tmp/accum_log
done < /tmp/list
if [ -z "$prev_sha1" ]; then
echo "Warning: no commits found to squash!"
sha1=$(git rev-parse target)
fi
make_squash_commit $prev_sha1 < /tmp/accum_log
git checkout -b temp_branch
rm /tmp/list /tmp/accum_log
script : , ( , , , ). "" , git commit-tree (. ).