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'
+squash merge subtree changes as a single commit
"
eval $(echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?)
. git-sh-setup
rejoin=
ignore_joins=
annotate=
+squash=
debug()
{
--no-rejoin) rejoin= ;;
--ignore-joins) ignore_joins=1 ;;
--no-ignore-joins) ignore_joins= ;;
+ --squash) squash=1 ;;
+ --no-squash) squash= ;;
--) break ;;
*) die "Unexpected option: $opt" ;;
esac
case "$a" in
git-subtree-mainline:) main="$b" ;;
git-subtree-split:) sub="$b" ;;
- *)
+ END)
if [ -n "$main" -a -n "$sub" ]; then
debug " Prior: $main -> $sub"
cache_set $main $sub
try_remove_previous "$main"
try_remove_previous "$sub"
- main=
- sub=
fi
+ main=
+ sub=
;;
esac
done
EOF
}
-merge_msg()
+rejoin_msg()
{
dir="$1"
latest_old="$2"
tree=$(subtree_for_commit $rev "$dir")
debug " tree is: $tree"
+
+ # ugly. is there no better way to tell if this is a subtree
+ # vs. a mainline commit? Does it matter?
[ -z $tree ] && continue
newrev=$(copy_or_skip "$rev" "$tree" "$newparents") || exit $?
debug "Merging split branch into HEAD..."
latest_old=$(cache_get latest_old)
git merge -s ours \
- -m "$(merge_msg $dir $latest_old $latest_new)" \
+ -m "$(rejoin_msg $dir $latest_old $latest_new)" \
$latest_new >&2 || exit $?
fi
if [ -n "$branch" ]; then