summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Avery Pennarun <apenwarr@gmail.com>2009-04-24 22:05:30 -0400
committerLibravatar Avery Pennarun <apenwarr@gmail.com>2009-04-24 22:05:30 -0400
commitd691265880abea4428783beb858683be56f3b340 (patch)
treef7750f07776f31350dfb84679b45fb82dd809f79
parentPrune out some extra merge commits by comparing their parents correctly. (diff)
downloadtgif-d691265880abea4428783beb858683be56f3b340.tar.xz
Even more aggressive commit trimming.
Now we cut out a commit if any of its parents had the same tree; just use that parent in its place. This makes the history look nice, but I don't think it's quite right...
-rwxr-xr-xgit-subtree.sh34
-rwxr-xr-xtest.sh2
2 files changed, 25 insertions, 11 deletions
diff --git a/git-subtree.sh b/git-subtree.sh
index e6d8ce8817..03107e2251 100755
--- a/git-subtree.sh
+++ b/git-subtree.sh
@@ -202,6 +202,29 @@ tree_changed()
fi
}
+copy_or_skip()
+{
+ rev="$1"
+ tree="$2"
+ newparents="$3"
+ assert [ -n "$tree" ]
+
+ 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
+ p="$p -p $parent"
+ fi
+ done
+
+ copy_commit $rev $tree "$p" || exit $?
+}
+
cmd_split()
{
debug "Splitting $dir..."
@@ -238,16 +261,7 @@ cmd_split()
debug " tree is: $tree"
[ -z $tree ] && continue
- p=""
- for parent in $newparents; do
- p="$p -p $parent"
- done
-
- if tree_changed $tree $newparents; then
- newrev=$(copy_commit $rev $tree "$p") || exit $?
- else
- newrev="$newparents"
- fi
+ newrev=$(copy_or_skip "$rev" "$tree" "$newparents") || exit $?
debug " newrev is: $newrev"
cache_set $rev $newrev
cache_set latest_new $newrev
diff --git a/test.sh b/test.sh
index 8a9d92f703..a8ed0dbc7d 100755
--- a/test.sh
+++ b/test.sh
@@ -93,4 +93,4 @@ git branch subproj-merge-split3
cd ../mainline
git fetch ../subproj subproj-merge-split3
git branch subproj-merge-split3 FETCH_HEAD
-git merge subproj-merge-split3
+git merge -s subtree subproj-merge-split3