1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-11-01 23:07:55 +01:00

Okay, that was a little too aggressive.

Now we only prune out a commit if it has exactly one remaining parent and
that parent's tree is identical to ours.

But I also changed the test to create the initial "-s ours" merge in one
step instead of two, and that merge can be eliminated since one of its
parents doesn't affect the subdir at all, and is thus deleted.
This commit is contained in:
Avery Pennarun 2009-04-24 22:36:06 -04:00
parent d691265880
commit 96db2c0448
2 changed files with 36 additions and 15 deletions

View file

@ -4,17 +4,21 @@
# #
# Copyright (C) 2009 Avery Pennarun <apenwarr@gmail.com> # Copyright (C) 2009 Avery Pennarun <apenwarr@gmail.com>
# #
if [ $# -eq 0 ]; then
set -- -h
fi
OPTS_SPEC="\ OPTS_SPEC="\
git subtree split [--rejoin] [--onto rev] <commit...> -- <path> git subtree split [options...] <commit...> -- <path>
git subtree merge git subtree merge
git subtree does foo and bar! git subtree does foo and bar!
-- --
h,help show the help h,help show the help
q quiet q quiet
v verbose v verbose
onto= existing subtree revision to search for parent 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
ignore-joins ignore prior --rejoin commits
" "
eval $(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?) eval $(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)
. git-sh-setup . git-sh-setup
@ -24,6 +28,7 @@ quiet=
command= command=
onto= onto=
rejoin= rejoin=
ignore_joins=
debug() debug()
{ {
@ -50,7 +55,11 @@ while [ $# -gt 0 ]; do
case "$opt" in case "$opt" in
-q) quiet=1 ;; -q) quiet=1 ;;
--onto) onto="$1"; shift ;; --onto) onto="$1"; shift ;;
--no-onto) onto= ;;
--rejoin) rejoin=1 ;; --rejoin) rejoin=1 ;;
--no-rejoin) rejoin= ;;
--ignore-joins) ignore_joins=1 ;;
--no-ignore-joins) ignore_joins= ;;
--) break ;; --) break ;;
esac esac
done done
@ -209,20 +218,25 @@ copy_or_skip()
newparents="$3" newparents="$3"
assert [ -n "$tree" ] assert [ -n "$tree" ]
p="" identical=
p=
for parent in $newparents; do for parent in $newparents; do
ptree=$(toptree_for_commit $parent) || exit $? ptree=$(toptree_for_commit $parent) || exit $?
if [ "$ptree" = "$tree" ]; then if [ "$ptree" = "$tree" ]; then
# any identical parent means this commit is unnecessary # an identical parent could be used in place of this rev.
echo $parent identical="$parent"
return 0 fi
elif [ -n "$ptree" ]; then if [ -n "$ptree" ]; then
# an existing, non-identical parent is important parentmatch="$parentmatch$parent"
p="$p -p $parent" p="$p -p $parent"
fi fi
done done
copy_commit $rev $tree "$p" || exit $? if [ -n "$identical" -a "$parentmatch" = "$identical" ]; then
echo $identical
else
copy_commit $rev $tree "$p" || exit $?
fi
} }
cmd_split() cmd_split()
@ -241,7 +255,11 @@ cmd_split()
done done
fi fi
unrevs="$(find_existing_splits "$dir" "$revs")" if [ -n "$ignore_joins" ]; then
unrevs=
else
unrevs="$(find_existing_splits "$dir" "$revs")"
fi
debug "git rev-list --reverse $revs $unrevs" debug "git rev-list --reverse $revs $unrevs"
git rev-list --reverse --parents $revs $unrevsx | git rev-list --reverse --parents $revs $unrevsx |

View file

@ -35,7 +35,10 @@ git fetch ../subproj sub1
git branch sub1 FETCH_HEAD git branch sub1 FETCH_HEAD
git read-tree --prefix=subdir FETCH_HEAD git read-tree --prefix=subdir FETCH_HEAD
git checkout subdir git checkout subdir
git commit -m 'initial-subdir-merge' tree=$(git write-tree)
com=$(echo initial-subdir-merge | git commit-tree $tree -p HEAD -p FETCH_HEAD)
git reset $com
#git commit -m 'initial-subdir-merge'
git merge -m 'merge -s -ours' -s ours FETCH_HEAD git merge -m 'merge -s -ours' -s ours FETCH_HEAD