git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Matthew Wilcox <matthew@wil.cx>
To: git@vger.kernel.org
Subject: git-merge-subordinate
Date: Wed, 25 Oct 2006 09:50:10 -0600	[thread overview]
Message-ID: <20061025155009.GD5591@parisc-linux.org> (raw)


Linus doesn't like seeing unnecessary merges in his tree.  I'm not a huge
fan of them either.  Wouldn't it be nice if we had a merge method that
did a merge without creating a merge?  I call it git-merge-subordinate
(since my tree is subordinate to the tree I'm pulling from).  I suppose
you could call it 'slave' if you want to be more pithy.  Anyway, this
is a first attempt, and it's totally cargo-cult programming; I make no
claim that I understand what I'm doing.  But it does seem to work.

While working on it, I found a small bug in git-merge.  When
no_trivial_merge_strategies has more than one component, setting
index_merge to f doesn't work.  So first, here's the patch to git-merge
adding support for 'subordinate':

--- /usr/bin/git-merge	2006-07-29 15:47:09.000000000 -0600
+++ /home/willy/bin/git-merge	2006-10-25 09:21:00.000000000 -0600
@@ -9,15 +9,15 @@
 LF='
 '
 
-all_strategies='recursive octopus resolve stupid ours'
+all_strategies='recursive octopus resolve stupid subordinate ours'
 default_twohead_strategies='recursive'
 default_octopus_strategies='octopus'
-no_trivial_merge_strategies='ours'
+no_trivial_merge_strategies='subordinate ours'
 use_strategies=
 
 index_merge=t
 if test ""; then
-	all_strategies='resolve octopus stupid ours'
+	all_strategies='resolve octopus stupid subordinate ours'
 	default_twohead_strategies='resolve'
 fi
 
@@ -154,12 +154,15 @@
 
 for s in $use_strategies
 do
-	case " $s " in
-	*" $no_trivial_merge_strategies "*)
-		index_merge=f
-		break
-		;;
-	esac
+	for t in $no_trivial_merge_strategies
+	do
+		case "$s" in
+		"$t")
+			index_merge=f
+			break
+			;;
+		esac
+	done
 done
 
 case "$#" in


And now, here's the extremely lame git-merge-subordinate script.

#!/bin/sh
#
# Copyright (c) 2005 Linus Torvalds
# Copyright (c) 2005 Junio C Hamano
#
# Resolve two trees, using enhancd multi-base read-tree.

# The first parameters up to -- are merge bases; the rest are heads.
bases= head= remotes= sep_seen=
for arg
do
	case ",$sep_seen,$head,$arg," in
	*,--,)
		sep_seen=yes
		;;
	,yes,,*)
		head=$arg
		;;
	,yes,*)
		remotes="$remotes$arg "
		;;
	*)
		bases="$bases$arg "
		;;
	esac
done

# Give up if we are given more than two remotes -- not handling octopus.
case "$remotes" in
?*' '?*)
	exit 2 ;;
esac

# Give up if this is a baseless merge.
if test '' = "$bases"
then
	exit 2
fi

git-rebase $remotes || exit 2
if result_tree=$(git-write-tree  2>/dev/null)
then
	exit 0
else
	echo "Simple merge failed, trying Automatic merge."
	if git-merge-index -o git-merge-one-file -a
	then
		exit 0
	else
		exit 1
	fi
fi

             reply	other threads:[~2006-10-25 15:50 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-10-25 15:50 Matthew Wilcox [this message]
2006-10-25 16:11 ` git-merge-subordinate Jakub Narebski
2006-10-25 16:19   ` git-merge-subordinate Johannes Schindelin
2006-10-25 16:27     ` git-merge-subordinate Shawn Pearce

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20061025155009.GD5591@parisc-linux.org \
    --to=matthew@wil.cx \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).