Any thoughts on something like the following? I was talking with Jakub Narebski on #git today about using a diff/apply pipeline as a merge strategy. I was talking about implementing this within the merge-recur driver as an alternative to invoking the RCS 'merge' program. The idea would be to take the current branch's file and try to apply the diff of merge_base and the other branch to it. If that has any rejects then try the other direction (apply diff of merge_base and current to other) and leave the user with whichever one resulted in the smallest number of rejected lines. But that's a little bit more work, this is a quick hack. :-) -- >8 -- Create merge strategy 'applyreject'. The applyreject merge strategy is a two head merge strategy which performs the merge by obtaining the diff between the common base and the branch being merged and applies it to the current branch using git-apply --reject. Consequently any failures are written to .rej files, rather than using the RCS <<<<<<< ======= >>>>>>> format. Signed-off-by: Shawn O. Pearce <spearce@xxxxxxxxxxx> --- .gitignore | 1 + Makefile | 1 + git-merge-applyreject.sh | 26 ++++++++++++++++++++++++++ git-merge.sh | 2 +- 4 files changed, 29 insertions(+), 1 deletions(-) diff --git a/.gitignore b/.gitignore index 0d608fe..0f43ece 100644 --- a/.gitignore +++ b/.gitignore @@ -56,6 +56,7 @@ git-ls-tree git-mailinfo git-mailsplit git-merge +git-merge-applyreject git-merge-base git-merge-index git-merge-tree diff --git a/Makefile b/Makefile index 7b3114f..a57dab5 100644 --- a/Makefile +++ b/Makefile @@ -161,6 +161,7 @@ SCRIPT_SH = \ git-tag.sh git-verify-tag.sh \ git-applymbox.sh git-applypatch.sh git-am.sh \ git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \ + git-merge-applyreject.sh \ git-merge-resolve.sh git-merge-ours.sh \ git-lost-found.sh git-quiltimport.sh diff --git a/git-merge-applyreject.sh b/git-merge-applyreject.sh new file mode 100755 index 0000000..e4c8703 --- /dev/null +++ b/git-merge-applyreject.sh @@ -0,0 +1,26 @@ +#!/bin/sh +# +# Simple merge strategy which produces reject files on failed merges. +# Only handles two heads and one merge base, thus the command line +# parameters must be: base -- head1 head2 + +base="$1"; shift; [ -z "$base" ] && exit 2 +while [ $# -gt 2 -a "X$1" != "X--" ] +do + shift +done +if [ "X$1" = "X--" ] +then + shift +else + exit 2 +fi +current="$1"; shift; [ -z "$current" ] && exit 2 +incoming="$1"; shift; [ -z "$incoming" ] && exit 2 +[ $# -gt 0 ] && exit 2 + +git-read-tree --reset $current || exit 2 +git-update-index --refresh 2>/dev/null +git-diff --binary -M $base $incoming \ + | git-apply --index --reject --verbose +[ $? = 0 ] || exit 1 diff --git a/git-merge.sh b/git-merge.sh index d049e16..e39de0a 100755 --- a/git-merge.sh +++ b/git-merge.sh @@ -9,7 +9,7 @@ USAGE='[-n] [--no-commit] [--squash] [-s LF=' ' -all_strategies='recursive recur octopus resolve stupid ours' +all_strategies='recursive recur octopus resolve stupid ours applyreject' case "${GIT_USE_RECUR_FOR_RECURSIVE}" in '') default_twohead_strategies=recursive ;; -- 1.4.2.gc52f - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html