summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: d691265)
raw | patch | inline | side by side (parent: d691265)
author | Avery Pennarun <apenwarr@gmail.com> | |
Sat, 25 Apr 2009 02:36:06 +0000 (22:36 -0400) | ||
committer | Avery Pennarun <apenwarr@gmail.com> | |
Sat, 25 Apr 2009 02:38:58 +0000 (22:38 -0400) |
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.
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.
git-subtree.sh | patch | blob | history | |
test.sh | patch | blob | history |
diff --git a/git-subtree.sh b/git-subtree.sh
index 03107e2251c35e0f31e4e29ab9f0fb5515079ced..d42cc1a1643cfd03b797ddc101fdca52a4023026 100755 (executable)
--- a/git-subtree.sh
+++ b/git-subtree.sh
#
# Copyright (C) 2009 Avery Pennarun <apenwarr@gmail.com>
#
+if [ $# -eq 0 ]; then
+ set -- -h
+fi
OPTS_SPEC="\
-git subtree split [--rejoin] [--onto rev] <commit...> -- <path>
+git subtree split [options...] <commit...> -- <path>
git subtree merge
git subtree does foo and bar!
--
-h,help show the help
-q quiet
-v verbose
-onto= existing subtree revision to search for parent
-rejoin merge the new branch back into HEAD
+h,help show the help
+q quiet
+v verbose
+onto= try connecting new tree to an existing one
+rejoin merge the new branch back into HEAD
+ignore-joins ignore prior --rejoin commits
"
eval $(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)
. git-sh-setup
command=
onto=
rejoin=
+ignore_joins=
debug()
{
case "$opt" in
-q) quiet=1 ;;
--onto) onto="$1"; shift ;;
+ --no-onto) onto= ;;
--rejoin) rejoin=1 ;;
+ --no-rejoin) rejoin= ;;
+ --ignore-joins) ignore_joins=1 ;;
+ --no-ignore-joins) ignore_joins= ;;
--) break ;;
esac
done
newparents="$3"
assert [ -n "$tree" ]
- p=""
+ identical=
+ p=
for parent in $newparents; do
ptree=$(toptree_for_commit $parent) || exit $?
if [ "$ptree" = "$tree" ]; then
- # any identical parent means this commit is unnecessary
- echo $parent
- return 0
- elif [ -n "$ptree" ]; then
- # an existing, non-identical parent is important
+ # an identical parent could be used in place of this rev.
+ identical="$parent"
+ fi
+ if [ -n "$ptree" ]; then
+ parentmatch="$parentmatch$parent"
p="$p -p $parent"
fi
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()
done
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"
git rev-list --reverse --parents $revs $unrevsx |
index a8ed0dbc7d9b927ddb12d7e42c925ce12867a68d..39c4382f0df292b1969e73f6dd52007baf18e536 100755 (executable)
--- a/test.sh
+++ b/test.sh
git branch sub1 FETCH_HEAD
git read-tree --prefix=subdir FETCH_HEAD
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