1
0
mirror of https://github.com/git/git.git synced 2024-10-22 11:18:17 +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
onto= try connecting new tree to an existing one
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
"
eval $(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)
@ -169,11 +169,16 @@ try_remove_previous()
find_latest_squash()
{
debug "Looking for latest squash..."
debug "Looking for latest squash ($dir)..."
dir="$1"
sq=
main=
sub=
git log --grep="^git-subtree-dir: $dir\$" \
--pretty=format:'START %H%n%s%n%n%b%nEND%n' HEAD |
while read a b junk; do
debug "$a $b $junk"
debug "{{$sq/$main/$sub}}"
case "$a" in
START) sq="$b" ;;
git-subtree-mainline:) main="$b" ;;
@ -202,6 +207,8 @@ find_existing_splits()
debug "Looking for prior splits..."
dir="$1"
revs="$2"
main=
sub=
git log --grep="^git-subtree-dir: $dir\$" \
--pretty=format:'START %H%n%s%n%n%b%nEND%n' $revs |
while read a b junk; do
@ -284,21 +291,21 @@ squash_msg()
dir="$1"
oldsub="$2"
newsub="$3"
oldsub_short=$(git rev-parse --short "$oldsub")
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"
git log --pretty=tformat:'REVERT: %h %s' "$newsub..$oldsub"
cat <<-EOF
git-subtree-dir: $dir
git-subtree-split: $newsub
EOF
echo
echo "git-subtree-dir: $dir"
echo "git-subtree-split: $newsub"
}
toptree_for_commit()
@ -341,8 +348,13 @@ new_squash_commit()
oldsub="$2"
newsub="$3"
tree=$(toptree_for_commit $newsub) || exit $?
squash_msg "$dir" "$oldsub" "$newsub" |
git commit-tree "$tree" -p "$old" || exit $?
if [ -n "$old" ]; then
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()
@ -422,9 +434,18 @@ cmd_add()
else
headp=
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 $?
say "Added dir '$dir'"
}
cmd_split()

7
todo

@ -10,11 +10,14 @@
"-s subtree" should be given an explicit subtree option?
There doesn't seem to be a way to do this. We'd have to
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 '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
automated tests for --squash stuff