From: Martin von Zweigbergk <martin.von.zweigbergk@gmail.com>
To: "Santi Béjar" <santi@agolina.net>
Cc: Martin von Zweigbergk <martin.von.zweigbergk@gmail.com>,
Junio C Hamano <gitster@pobox.com>,
git@vger.kernel.org, Thomas Rast <trast@student.ethz.ch>
Subject: Re: [PATCH] rebase: be cleverer with rebased upstream branches
Date: Sat, 12 Mar 2011 20:32:39 -0500 (EST) [thread overview]
Message-ID: <alpine.DEB.2.00.1103122005490.15442@debian> (raw)
In-Reply-To: <AANLkTikrYbY6r5hYnhWCB1GVKbPgounxdvAGeejsUKoC@mail.gmail.com>
On Sun, 13 Mar 2011, Santi B?jar wrote:
> First, care to share the scripts/patches for the timings? Thanks.
Sure, see end of mail for the changes to git-rebase.sh. It applies on
top of the patch that started this thread. There are some minor
differences from what I used when I ran the tests, but nothing that
should impact the timings.
To run the tests, I just did modified versions of
git reset --hard u@{100}
touch foo && git add foo && git ci -m foo
time git rebase -n --guess-base=merge u
I don't have a script that creates the initial setup, but that should
be easy enough to do. I should warn you that it took 16 hours to run
it on my 6 year old computer :-).
> Could you test also variants of the exponential strategy?
I guess I could :-). Will see if I get time for that later today.
> exponential(n,m): like merge-base, but start with n candidates {u@{0},
> ..., u@{n-1}}, then n*m candidates and so on until a commit that b
> contains is found.
>
> Your exponential would be exponential(1,2).
>
> Timings for something like exponential(10,2) or exponential(10,10),
> maybe others.
>
> Thanks,
> Santi
>
-- 8< --
diff --git a/git-rebase.sh b/git-rebase.sh
index b50c91e..8a4efab 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -56,6 +56,7 @@ ignore-date! passed to 'git am'
whitespace=! passed to 'git apply'
ignore-whitespace! passed to 'git apply'
C=! passed to 'git apply'
+guess-base=! to guess the base
Actions:
continue! continue rebasing process
abort! abort rebasing process and restore original branch
@@ -87,6 +88,7 @@ git_am_opt=
rebase_root=
force_rebase=
allow_rerere_autoupdate=
+guess_base=
# Non-empty if a rebase was in progress when 'git rebase' was invoked
in_progress=
# One of {am, merge, interactive}
@@ -228,6 +230,10 @@ do
--no-autosquash)
autosquash=
;;
+ --guess-base)
+ shift
+ guess_base=$1
+ ;;
-M|-m)
do_merge=t
;;
@@ -459,19 +465,51 @@ esac
require_clean_work_tree "rebase" "Please commit or stash them."
-upstream_ref=$(git rev-parse -q --verify --symbolic-full-name \
- "$upstream_name") && test -n "$upstream_ref" &&
-for reflog in $(git rev-list -g $upstream_name 2>/dev/null)
-do
- if test $reflog = $(git merge-base $reflog $orig_head)
- then
- if test $reflog != $(git merge-base $onto $reflog)
- then
- upstream=$reflog
- fi
- break
- fi
-done
+if test -n "$guess_base" && test -n "$(git rev-parse -q --verify \
+ --symbolic-full-name "$upstream_name")"
+then
+ case $guess_base in
+ linear)
+ for reflog in $(git rev-list -g $upstream_name 2>/dev/null)
+ do
+ if test $reflog = $(git merge-base $reflog $orig_head)
+ then
+ if test $reflog != $(git merge-base $onto $reflog)
+ then
+ upstream=$reflog
+ fi
+ break
+ fi
+ done
+ ;;
+ merge)
+ upstream=$(git merge-base $orig_head $(git rev-list -g $upstream_name 2>/dev/null))
+ ;;
+ exponential)
+ reflogs=$(git rev-list -g $upstream_name 2>/dev/null)
+ limit=$(echo "$reflogs" | wc -l)
+ lo=0
+ hi=1
+ while true
+ do
+ echo $lo - $hi
+ candidates=$(echo "$reflogs" | head -$hi | tail -$(($hi - $lo)))
+ reflog=$(git merge-base $orig_head $candidates)
+ if test -n "$(echo $candidates | grep $reflog)"
+ then
+ upstream=$reflog
+ break
+ fi
+ if test $hi -ge $limit
+ then
+ break
+ fi
+ lo=$hi
+ hi=$((2 * $lo))
+ done
+ ;;
+ esac
+fi
# Now we are rebasing commits $upstream..$orig_head (or with --root,
# everything leading up to $orig_head) on top of $onto
next prev parent reply other threads:[~2011-03-13 1:32 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-02-14 13:51 [PATCH] rebase: be cleverer with rebased upstream branches Martin von Zweigbergk
2011-02-15 11:28 ` Santi Béjar
2011-02-16 1:37 ` Martin von Zweigbergk
2011-02-16 9:26 ` Santi Béjar
2011-02-15 20:30 ` Junio C Hamano
2011-02-16 3:03 ` Martin von Zweigbergk
2011-02-16 12:10 ` Santi Béjar
2011-02-16 13:22 ` Santi Béjar
2011-02-16 19:07 ` Junio C Hamano
2011-02-16 21:16 ` Santi Béjar
2011-02-16 16:45 ` Martin von Zweigbergk
2011-02-17 10:24 ` Santi Béjar
2011-03-12 21:15 ` Martin von Zweigbergk
2011-03-12 23:51 ` Santi Béjar
2011-03-13 1:32 ` Martin von Zweigbergk [this message]
2011-03-13 3:14 ` Martin von Zweigbergk
2011-03-13 22:57 ` Junio C Hamano
2011-03-13 23:42 ` Santi Béjar
2011-03-13 23:09 ` Santi Béjar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.DEB.2.00.1103122005490.15442@debian \
--to=martin.von.zweigbergk@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=santi@agolina.net \
--cc=trast@student.ethz.ch \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox