From: Geoffrey Lee <hidden> Date: 2016-06-15 22:48:18
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?
For example, let's say that I merge two branches and perform another
commit on top of the merge:
git init
echo "initial file" > test.txt
git add test.txt
git commit -m "Commit A"
git checkout -b foo master
echo "foo" > test.txt
git commit -a -m "Commit B"
git checkout -b bar master
echo "bar" > test.txt
git commit -a -m "Commit C"
git merge foo
echo "foobar" > test.txt
git commit -a -m "Commit M"
echo "2nd line" >> test.txt
git commit -a -m "Commit D"
This creates the following tree:
B
/ \
A M - D
\ /
C
Now I try to checkout the initial commit and replay the above changes:
git checkout -b replay master
git format-patch --stdout master..bar | git am -3
This produces a merge conflict. In this scenario, "git format-patch
master..bar" only produces 3 patches, omitting "Commit M". How do I
deal with this?
-Geoffrey Lee
From: Jeff King <hidden> Date: 2016-06-15 22:48:18
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.
-Peff
From: Geoffrey Lee <hidden> Date: 2016-06-15 22:48:18
On Thu, Feb 18, 2010 at 12:37 PM, Jeff King [off-list ref] wrote:
On Thu, Feb 18, 2010 at 03:40:07AM -0800, Geoffrey Lee wrote:
quoted
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!
-Geoffrey Lee
From: Clemens Buchacher <hidden> Date: 2016-06-15 22:48:19
On Fri, Feb 19, 2010 at 02:25:14AM -0800, Geoffrey Lee wrote:
On Thu, Feb 18, 2010 at 12:37 PM, Jeff King [off-list ref] wrote:
quoted
On Thu, Feb 18, 2010 at 03:40:07AM -0800, Geoffrey Lee wrote:
quoted
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[@]}