git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: How to create patches for a merge?

From
Clemens Buchacher <drizzd@aon.at>
Date
Feb 20, 2010, 17:39 UTC
Message-ID
<20100220173910.GA4095@localhost>
In-Reply-To
<83d7aaa41002190225o3255248re1581a86e1346f28@mail.gmail.com>
On Fri, Feb 19, 2010 at 02:25:14AM -0800, Geoffrey Lee wrote:
Show 12 quoted lines
> On Thu, Feb 18, 2010 at 12:37 PM, Jeff King <peff@peff.net> wrote:
> > On Thu, Feb 18, 2010 at 03:40:07AM -0800, Geoffrey Lee wrote:
> >
> >> When I use "git format-patch", it doesn't seem to include merges. How
> >> can I perform a merge and then e-mail it to someone as a set of
> >> patches?
> >
> > Is it important that it be patches, or simply that it go over email? In
> > the latter case, you can use "git bundle" to create a set of commits,
> > including merges, and send them to the remote.
> 
> I was not aware of "git bundle". That does exactly what I need. Thanks!

Below is git-send-bdl, a small wrapper I use for git bundle. It creates bundles only for the commits which are not already known to the origin and mails them to a configured address. It requires mutt for sending emails (the -m option is just for show). It should probably use sendmail. But maybe this is still useful as a reference.

Have fun, Clemens ---

#!/bin/bash
usage ()
{
	echo "`basename $0`: [-t <address>] [-m <mailer>] [-r <remote>] [<repo>...]" >&2
	exit 1
}
if ! test -x `which getopt`
then
	echo "fatal: getopt required but not found" >&2
	exit 2
fi
OPT=`getopt -o et:m:r: -- "$@"`
code=$?
if test $code -gt 0
then
	usage
	exit 1
fi
eval set -- "$OPT"
mailer=${GIT_SEND_BDL_MAILER:-mutt}
remote=origin
addr=
edit=
while test "$1" != "--"
do
	case "$1" in
		-r) remote="$2"; shift;;
		-m) mailer="$2"; shift;;
		-t) addr="$addr $2"; shift;;
		-e) edit=YesPlease;;
		-h) usage;;
		*) echo "unkown option: $1" >&2; exit 2;;
	esac
	shift
done
shift
if test -z $addr
then
	addr="$GIT_SEND_BDL_TO"
fi
if test $# -eq 0
then
	cdup=`git rev-parse --show-cdup 2>/dev/null`
	if test $? -gt 0
	then
		echo "fatal: no repositories specified and none found" >&2
		usage
	fi
	set -- "$PWD/${cdup}"
fi
if test -z "$addr"
then
	echo "fatal: no recipients specified" >&2
	usage
fi
if ! test -x `which $mailer`
then
	echo "fatal: mailer not found: $mailer" >&2
	usage
fi
bundle=()
while test $# -gt 0
do
	path=$1
	shift
	cd $path
	name=`basename "$PWD"`
	echo " * $name"
	target=/tmp/${name}.git
	if ! git remote | grep -q "^$remote\$"
	then
		echo error: unknown remote: $remote >&2
		continue
	fi
	refs="--branches"
	remote_refs=`git show-ref | cut -f2 -d' ' | \
			grep ^refs/remotes/$remote/`
	if test -n "$remote_refs"
	then
		refs="$refs --not $remote_refs"
	fi
	refs="$refs --tags"
	git bundle create $target $refs
	cd - >/dev/null
	bundle[${#bundle[@]}]=$target
done
attachments=
for i in ${bundle[@]}
do
	if test -f $i
	then
		attachments="$attachments $i"
	fi
done
exec 3</dev/null
if test -n "$edit"
then
	exec 3<&0
fi
$mailer -s 'git bundles' -a $attachments -- $addr <&3
ret=$?
exec 3<&-
if test $ret -gt 0
then
	echo "fatal: mailer exited with status $ret" >&2
	exit 1
fi
rm -f ${bundle[@]}
Previous: Geoffrey Lee
Message 5 of 5 in “How to create patches for a merge?”
  1. Geoffrey LeeFeb 18, 2010
  2. Junio C HamanoFeb 18, 2010
  3. Jeff KingFeb 18, 2010
  4. Geoffrey LeeFeb 19, 2010
  5. Clemens BuchacherFeb 20, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.