git-commit-vandalism/git-rebase-script
Junio C Hamano 99a92f928f Make rebase script saner.
It did not check to see if the working tree was clean and matched
the commit we were starting out as, resulting in the initial rebased
commit including whatever dirty state the working tree has had.

Signed-off-by: Junio C Hamano <junkio@cox.net>
2005-08-17 15:19:57 -07:00

60 lines
1.2 KiB
Bash
Executable File

#!/bin/sh
#
# Copyright (c) 2005 Junio C Hamano.
#
. git-sh-setup-script || die "Not a git archive."
usage="usage: $0 "'<upstream> [<head>]
Uses output from git-cherry to rebase local commits to the new head of
upstream tree.'
case "$#,$1" in
1,*..*)
upstream=$(expr "$1" : '\(.*\)\.\.') ours=$(expr "$1" : '.*\.\.\(.*\)$')
set x "$upstream" "$ours"
shift ;;
esac
git-update-cache --refresh || exit
case "$#" in
1) ours_symbolic=HEAD ;;
2) ours_symbolic="$2" ;;
*) die "$usage" ;;
esac
upstream=`git-rev-parse --verify "$1"` &&
ours=`git-rev-parse --verify "$ours_symbolic^` || exit
test "$(git-diff-cache --cached "$ours")" = "" ||
die "Your working tree does not match $ours_symbolic."
git-read-tree -m -u $ours $upstream &&
git-rev-parse --verify "$upstream^0" >"$GIT_DIR/HEAD" || exit
tmp=.rebase-tmp$$
fail=$tmp-fail
trap "rm -rf $tmp-*" 0 1 2 3 15
>$fail
git-cherry $upstream $ours |
while read sign commit
do
case "$sign" in
-) continue ;;
esac
S=`cat "$GIT_DIR/HEAD"` &&
GIT_EXTERNAL_DIFF=git-apply-patch-script git-diff-tree -p $commit &&
git-commit-script -C "$commit" || {
echo $commit >>$fail
git-read-tree --reset -u $S
}
done
if test -s $fail
then
echo Some commits could not be rebased, check by hand:
cat $fail
fi