[PATCH] git-cherry: find commits not merged upstream.
The git-cherry command helps the git-rebase script by finding commits that have not been merged upstream. Commits already included in upstream are prefixed with '-' (meaning "drop from my local pull"), while commits missing from upstream are prefixed with '+' (meaning "add to the updated upstream"). Signed-off-by: Junio C Hamano <junkio@cox.net> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
5fec3ef101
commit
93c36dcd0a
2
Makefile
2
Makefile
@ -25,7 +25,7 @@ SCRIPTS=git git-apply-patch-script git-merge-one-file-script git-prune-script \
|
||||
git-deltafy-script git-fetch-script git-status-script git-commit-script \
|
||||
git-log-script git-shortlog git-cvsimport-script git-diff-script \
|
||||
git-reset-script git-add-script git-checkout-script git-clone-script \
|
||||
gitk
|
||||
gitk git-cherry
|
||||
|
||||
PROG= git-update-cache git-diff-files git-init-db git-write-tree \
|
||||
git-read-tree git-commit-tree git-cat-file git-fsck-cache \
|
||||
|
86
git-cherry
Executable file
86
git-cherry
Executable file
@ -0,0 +1,86 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (c) 2005 Junio C Hamano.
|
||||
#
|
||||
|
||||
usage="usage: $0 "'<upstream> [<head>]
|
||||
|
||||
__*__*__*__*__> <upstream>
|
||||
/
|
||||
fork-point
|
||||
\__+__+__+__+__+__+__+__> <head>
|
||||
|
||||
Each commit between the fork-point and <head> is examined, and
|
||||
compared against the change each commit between the fork-point and
|
||||
<upstream> introduces. If the change does not seem to be in the
|
||||
upstream, it is shown on the standard output.
|
||||
|
||||
The output is intended to be used as:
|
||||
|
||||
OLD_HEAD=$(git-rev-parse HEAD)
|
||||
git-rev-parse linus >${GIT_DIR-.}/HEAD
|
||||
git-cherry linus OLD_HEAD |
|
||||
while read commit
|
||||
do
|
||||
GIT_EXTERNAL_DIFF=git-apply-patch-script git-diff-tree -p "$commit" &&
|
||||
git-commit-script -m "$commit"
|
||||
done
|
||||
'
|
||||
|
||||
case "$#" in
|
||||
1) linus=`git-rev-parse "$1"` &&
|
||||
junio=`git-rev-parse HEAD` || exit
|
||||
;;
|
||||
2) linus=`git-rev-parse "$1"` &&
|
||||
junio=`git-rev-parse "$2"` || exit
|
||||
;;
|
||||
*) echo >&2 "$usage"; exit 1 ;;
|
||||
esac
|
||||
|
||||
# Note that these list commits in reverse order;
|
||||
# not that the order in inup matters...
|
||||
inup=`git-rev-list ^$junio $linus` &&
|
||||
ours=`git-rev-list $junio ^$linus` || exit
|
||||
|
||||
tmp=.cherry-tmp$$
|
||||
patch=$tmp-patch
|
||||
mkdir $patch
|
||||
trap "rm -rf $tmp-*" 0 1 2 3 15
|
||||
|
||||
_x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
|
||||
_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
|
||||
|
||||
for c in $inup
|
||||
do
|
||||
git-diff-tree -p $c
|
||||
done | git-patch-id |
|
||||
while read id name
|
||||
do
|
||||
echo $name >>$patch/$id
|
||||
done
|
||||
|
||||
LF='
|
||||
'
|
||||
|
||||
O=
|
||||
for c in $ours
|
||||
do
|
||||
set x `git-diff-tree -p $c | git-patch-id`
|
||||
if test "$2" != ""
|
||||
then
|
||||
if test -f "$patch/$2"
|
||||
then
|
||||
sign=-
|
||||
else
|
||||
sign=+
|
||||
fi
|
||||
case "$O" in
|
||||
'') O="$sign $c" ;;
|
||||
*) O="$sign $c$LF$O" ;;
|
||||
esac
|
||||
fi
|
||||
done
|
||||
case "$O" in
|
||||
'') ;;
|
||||
*) echo "$O" ;;
|
||||
esac
|
Loading…
Reference in New Issue
Block a user