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
next 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.