Browse Source
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>maint
![junkio@cox.net](/assets/img/avatar_default.png)
![Linus Torvalds](/assets/img/avatar_default.png)
2 changed files with 87 additions and 1 deletions
@ -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