You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

168 lines
3.1 KiB

Add Meta/Reintegrate In a workflow that uses topic branches heavily, you would need to keep updating test integration branch(es) all the time. If they are managed like my 'next' by merging the tips of topics that have grown since the last integration, it is not so difficult. You only need to review output from "git branch --no-merged next" to see if there are topics that can and needs to be merged to 'next'. But sometimes it is easier to rebuild a test integration branch from scratch all the time, especially if you do not publish it for others to build on. I've been using this script for some time to rebuild jch and pu branches in my workflow. jch's tip is supposed to always match 'next', but it is rebuilt from scratch on top of 'master' by merging the same topics that are in 'next'. You can use the same script in your work. To use it, you give a commit range base..tip to the script, and you will see a shell script that uses a series of 'git-merge'. "base" is the more stable branch that you rebuild your test integration branch on top (in my case, 'master'), and "tip" is where the tip of the test integration branch is from the last round (in my case, 'jch' or 'pu'). Then you can run the resulting script, fix conflicted merge and use 'git-commit', and then repeat until all the branches are re-integrated on top of the base branch. $ Meta/Reintegrate master..jch >/var/tmp/redo-jch.sh $ cat /var/tmp/redo-jch.sh #!/bin/sh while read branch eh do case "$eh" in "") git merge "$branch" || break ;; ?*) echo >&2 "Eh? $branch $eh"; break ;; esac done <<EOF jc/blame js/notes ks/maint-mailinfo-folded~3 tr/previous-branch EOF $ git checkout jch $ git reset --hard master $ /var/tmp/redo-jch.sh ... if there is conflict, resolve, "git commit" here ... $ /var/tmp/redo-jch.sh ... repeat until everything is applied. Signed-off-by: Junio C Hamano <gitster@pobox.com>
16 years ago
#!/bin/sh
accept_rerere=t generate=no update= diff=
while case "$#,$1" in 0,*) break;; *,-*) ;; esac
do
case "$1" in
-n) accept_rerere= ;;
-d) update=${2?"diff with what?"}
diff=yes
generate=yes
shift ;;
-u) update=${2?"update what?"}
generate=yes
shift ;;
*) generate=yes
break ;;
esac
shift
done
case "$generate" in
no)
accept_rerere () {
if test -z "$accept_rerere"
then
return 1
fi
if git diff |
grep -e "^.+" -e "^+." |
grep -e "^..<<<<<<<" -e "^..=======" -e "^..>>>>>>>" >/dev/null
then
return 1
else
EDITOR=: git commit -a --no-verify
echo "Accepted previous resolution"
return 0
fi
}
while read branch eh
do
case "$branch" in '#'*) continue ;; esac
case "$eh" in
"")
save=$(git rev-parse --verify HEAD)
echo >&2 "* $branch"
git merge "$branch" || accept_rerere || exit
this=$(git rev-parse --verify HEAD)
if test "$this" = "$save"
then
:
elif git show-ref -q --verify "refs/merge-fix/$branch"
then
echo >&2 "Fixing up the merge"
git cherry-pick --no-commit "refs/merge-fix/$branch" &&
EDITOR=: git commit --amend -a || exit
fi
;;
pick" "*)
echo >&2 "* $eh"
git cherry-pick "$branch" || exit ;;
*) echo >&2 "Eh? $branch $eh"; exit ;;
esac
done
exit
esac
if test -n "$update" && test $# = 0
then
set x $(sed -n -e '2s/^# //p' <"$update") &&
shift
fi
# Generation (or updating)
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"
LF='
'
Add Meta/Reintegrate In a workflow that uses topic branches heavily, you would need to keep updating test integration branch(es) all the time. If they are managed like my 'next' by merging the tips of topics that have grown since the last integration, it is not so difficult. You only need to review output from "git branch --no-merged next" to see if there are topics that can and needs to be merged to 'next'. But sometimes it is easier to rebuild a test integration branch from scratch all the time, especially if you do not publish it for others to build on. I've been using this script for some time to rebuild jch and pu branches in my workflow. jch's tip is supposed to always match 'next', but it is rebuilt from scratch on top of 'master' by merging the same topics that are in 'next'. You can use the same script in your work. To use it, you give a commit range base..tip to the script, and you will see a shell script that uses a series of 'git-merge'. "base" is the more stable branch that you rebuild your test integration branch on top (in my case, 'master'), and "tip" is where the tip of the test integration branch is from the last round (in my case, 'jch' or 'pu'). Then you can run the resulting script, fix conflicted merge and use 'git-commit', and then repeat until all the branches are re-integrated on top of the base branch. $ Meta/Reintegrate master..jch >/var/tmp/redo-jch.sh $ cat /var/tmp/redo-jch.sh #!/bin/sh while read branch eh do case "$eh" in "") git merge "$branch" || break ;; ?*) echo >&2 "Eh? $branch $eh"; break ;; esac done <<EOF jc/blame js/notes ks/maint-mailinfo-folded~3 tr/previous-branch EOF $ git checkout jch $ git reset --hard master $ /var/tmp/redo-jch.sh ... if there is conflict, resolve, "git commit" here ... $ /var/tmp/redo-jch.sh ... repeat until everything is applied. Signed-off-by: Junio C Hamano <gitster@pobox.com>
16 years ago
show_merge () {
case "$msg" in
"Merge branch '"*"'"*)
branch=$(expr "$msg" : "Merge branch '\(.*\)'")
merge_hier=heads/
;;
"Merge remote branch '"*"'"*)
branch=$(expr "$msg" : "Merge remote branch '\(.*\)'")
merge_hier=
;;
*)
echo 2>&1 "Huh?: $msg"
return
;;
esac &&
tip=$(git rev-parse --verify "refs/$merge_hier$branch" 2>/dev/null) &&
merged=$(git name-rev --refs="refs/$merge_hier$branch" "$other" 2>/dev/null) &&
merged=$(expr "$merged" : "$x40 \(.*\)") &&
test "$merged" != undefined || {
other=$(git log -1 --pretty='format:%s' $other) &&
merged="$branch :rebased? $other"
}
}
show_pick () {
merged="$(git rev-parse --verify "$commit") pick $msg"
}
generate () {
PROGRAM=$1
shift
echo '#!/bin/sh'
echo "# $1"
echo 'case "$#,$1" in'
echo '1,-u|1,-d)'
echo " exec $PROGRAM" '"$1" "$0"'
echo 'esac'
echo "$PROGRAM" '"$@" <<\EOF'
git log --pretty=oneline --first-parent "$1" |
{
series=
while read commit msg
do
if other=$(git rev-parse -q --verify "$commit^2")
then
show_merge
else
show_pick
fi
if test -z "$series"
then
series="$merged"
else
series="$merged$LF$series"
fi
done
echo "$series"
}
echo EOF
Add Meta/Reintegrate In a workflow that uses topic branches heavily, you would need to keep updating test integration branch(es) all the time. If they are managed like my 'next' by merging the tips of topics that have grown since the last integration, it is not so difficult. You only need to review output from "git branch --no-merged next" to see if there are topics that can and needs to be merged to 'next'. But sometimes it is easier to rebuild a test integration branch from scratch all the time, especially if you do not publish it for others to build on. I've been using this script for some time to rebuild jch and pu branches in my workflow. jch's tip is supposed to always match 'next', but it is rebuilt from scratch on top of 'master' by merging the same topics that are in 'next'. You can use the same script in your work. To use it, you give a commit range base..tip to the script, and you will see a shell script that uses a series of 'git-merge'. "base" is the more stable branch that you rebuild your test integration branch on top (in my case, 'master'), and "tip" is where the tip of the test integration branch is from the last round (in my case, 'jch' or 'pu'). Then you can run the resulting script, fix conflicted merge and use 'git-commit', and then repeat until all the branches are re-integrated on top of the base branch. $ Meta/Reintegrate master..jch >/var/tmp/redo-jch.sh $ cat /var/tmp/redo-jch.sh #!/bin/sh while read branch eh do case "$eh" in "") git merge "$branch" || break ;; ?*) echo >&2 "Eh? $branch $eh"; break ;; esac done <<EOF jc/blame js/notes ks/maint-mailinfo-folded~3 tr/previous-branch EOF $ git checkout jch $ git reset --hard master $ /var/tmp/redo-jch.sh ... if there is conflict, resolve, "git commit" here ... $ /var/tmp/redo-jch.sh ... repeat until everything is applied. Signed-off-by: Junio C Hamano <gitster@pobox.com>
16 years ago
}
if test -z "$update"
then
generate "$0" "$@"
elif test -z "$diff"
then
generate "$0" "$@" | diff -u "$update" -
if test $? = 0
then
echo >&2 "No changes."
else
echo >&2 -n "Update [Y/n]? "
read yesno
case "$yesno" in
[Yy]*)
generate "$0" "$@" |
sed -e 's/ :rebased?.*//' >"$update" ;;
*)
echo >&2 "No update then." ;;
esac
fi
else
generate "$0" "$@" | diff -u "$update" -
fi