1
0
mirror of https://github.com/git/git.git synced 2024-10-22 13:39:05 +02:00

Make --squash work with the 'add' command too.

This commit is contained in:
Avery Pennarun 2009-05-30 04:11:43 -04:00
parent 1a8c36dc5f
commit d713e2d87a
2 changed files with 44 additions and 20 deletions

@ -23,7 +23,7 @@ b,branch= create a new branch from the split subtree
ignore-joins ignore prior --rejoin commits ignore-joins ignore prior --rejoin commits
onto= try connecting new tree to an existing one onto= try connecting new tree to an existing one
rejoin merge the new branch back into HEAD rejoin merge the new branch back into HEAD
options for 'merge' and 'pull' options for 'add', 'merge', and 'pull'
squash merge subtree changes as a single commit squash merge subtree changes as a single commit
" "
eval $(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?) eval $(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)
@ -169,11 +169,16 @@ try_remove_previous()
find_latest_squash() find_latest_squash()
{ {
debug "Looking for latest squash..." debug "Looking for latest squash ($dir)..."
dir="$1" dir="$1"
sq=
main=
sub=
git log --grep="^git-subtree-dir: $dir\$" \ git log --grep="^git-subtree-dir: $dir\$" \
--pretty=format:'START %H%n%s%n%n%b%nEND%n' HEAD | --pretty=format:'START %H%n%s%n%n%b%nEND%n' HEAD |
while read a b junk; do while read a b junk; do
debug "$a $b $junk"
debug "{{$sq/$main/$sub}}"
case "$a" in case "$a" in
START) sq="$b" ;; START) sq="$b" ;;
git-subtree-mainline:) main="$b" ;; git-subtree-mainline:) main="$b" ;;
@ -202,6 +207,8 @@ find_existing_splits()
debug "Looking for prior splits..." debug "Looking for prior splits..."
dir="$1" dir="$1"
revs="$2" revs="$2"
main=
sub=
git log --grep="^git-subtree-dir: $dir\$" \ git log --grep="^git-subtree-dir: $dir\$" \
--pretty=format:'START %H%n%s%n%n%b%nEND%n' $revs | --pretty=format:'START %H%n%s%n%n%b%nEND%n' $revs |
while read a b junk; do while read a b junk; do
@ -284,21 +291,21 @@ squash_msg()
dir="$1" dir="$1"
oldsub="$2" oldsub="$2"
newsub="$3" newsub="$3"
oldsub_short=$(git rev-parse --short "$oldsub")
newsub_short=$(git rev-parse --short "$newsub") newsub_short=$(git rev-parse --short "$newsub")
cat <<-EOF
Squashed '$dir/' changes from $oldsub_short..$newsub_short
EOF if [ -n "$oldsub" ]; then
oldsub_short=$(git rev-parse --short "$oldsub")
echo "Squashed '$dir/' changes from $oldsub_short..$newsub_short"
echo
git log --pretty=tformat:'%h %s' "$oldsub..$newsub"
git log --pretty=tformat:'REVERT: %h %s' "$newsub..$oldsub"
else
echo "Squashed '$dir/' content from commit $newsub_short"
fi
git log --pretty=tformat:'%h %s' "$oldsub..$newsub" echo
git log --pretty=tformat:'REVERT: %h %s' "$newsub..$oldsub" echo "git-subtree-dir: $dir"
echo "git-subtree-split: $newsub"
cat <<-EOF
git-subtree-dir: $dir
git-subtree-split: $newsub
EOF
} }
toptree_for_commit() toptree_for_commit()
@ -341,8 +348,13 @@ new_squash_commit()
oldsub="$2" oldsub="$2"
newsub="$3" newsub="$3"
tree=$(toptree_for_commit $newsub) || exit $? tree=$(toptree_for_commit $newsub) || exit $?
squash_msg "$dir" "$oldsub" "$newsub" | if [ -n "$old" ]; then
git commit-tree "$tree" -p "$old" || exit $? squash_msg "$dir" "$oldsub" "$newsub" |
git commit-tree "$tree" -p "$old" || exit $?
else
squash_msg "$dir" "" "$newsub" |
git commit-tree "$tree" || exit $?
fi
} }
copy_or_skip() copy_or_skip()
@ -422,9 +434,18 @@ cmd_add()
else else
headp= headp=
fi fi
commit=$(add_msg "$dir" "$headrev" "$rev" |
git commit-tree $tree $headp -p "$rev") || exit $? if [ -n "$squash" ]; then
rev=$(new_squash_commit "" "" "$rev") || exit $?
commit=$(echo "Merge commit '$rev' as '$dir'" |
git commit-tree $tree $headp -p "$rev") || exit $?
else
commit=$(add_msg "$dir" "$headrev" "$rev" |
git commit-tree $tree $headp -p "$rev") || exit $?
fi
git reset "$commit" || exit $? git reset "$commit" || exit $?
say "Added dir '$dir'"
} }
cmd_split() cmd_split()

7
todo

@ -10,11 +10,14 @@
"-s subtree" should be given an explicit subtree option? "-s subtree" should be given an explicit subtree option?
There doesn't seem to be a way to do this. We'd have to There doesn't seem to be a way to do this. We'd have to
patch git-merge-subtree. Ugh. patch git-merge-subtree. Ugh.
(but we could avoid this problem by generating squashes with
exactly the right subtree structure, rather than using
subtree merge...)
add a 'push' subcommand to parallel 'pull' add a 'push' subcommand to parallel 'pull'
add a 'log' subcommand to see what's new in a subtree? add a 'log' subcommand to see what's new in a subtree?
add a --squash option so we don't merge histories but can still split
add to-submodule and from-submodule commands add to-submodule and from-submodule commands
automated tests for --squash stuff