Re: [PATCHv2 2/2] pull: support rebased upstream + fetch + pull --rebase
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Jul 17, 2009, 10:13 UTC
- Message-ID
- <alpine.DEB.1.00.0907171211430.4495@intel-tinevez-2-302>
- In-Reply-To
- <adf1fd3d0907160932r313de6e8lec23e4f3409b8c05@mail.gmail.com>
Hi,
On Thu, 16 Jul 2009, Santi Béjar wrote:
Show 13 quoted lines
> 2009/7/16 Johannes Schindelin <Johannes.Schindelin@gmx.de>: > > > On Thu, 16 Jul 2009, Santi Béjar wrote: > > > >> Use the fork commit of the current branch (where > >> the tip of upstream branch used to be) as the upstream parameter of > >> "git rebase". Compute it walking the reflog to find the first commit > >> which is an ancestor of the current branch. > > > > I finally understand what this patch is about. Thanks. > > Thanks, it was hard (at least for me) to provide a short and good > commit message.
It is the thing I found quite hard when I started contributing to Git, and it is still not exactly easy for me.
Show 40 quoted lines
> >> diff --git a/git-pull.sh b/git-pull.sh
> >> index 4b78a0c..31d3945 100755
> >> --- a/git-pull.sh
> >> +++ b/git-pull.sh
> >> @@ -125,9 +125,14 @@ test true = "$rebase" && {
> >> die "refusing to pull with rebase: your working tree is not up-to-date"
> >>
> >> . git-parse-remote &&
> >> - reflist="$(get_remote_merge_branch "$@" 2>/dev/null)" &&
> >> - oldremoteref="$(git rev-parse -q --verify \
> >> - "$reflist")"
> >> + remoteref="$(get_remote_merge_branch "$@" 2>/dev/null)" &&
> >> + num=0 &&
> >> + while oldremoteref="$(git rev-parse -q --verify "$remoteref@{$num}")"
> >> + do
> >
> > How about
> >
> > oldremoteref="$(git rev-list --boundary HEAD --not \
> > $(git rev-list -g $remoteref | sed 's/$/^@/') |
> > sed -e '/^[^-]/d' -e q)"
> >
> > Explanation: the "git rev-list -g $remoteref" lists the previous commits
> > the remote ref pointed to, and the ^@ appended to them means all their
> > parents. Now, the outer rev-list says to take everything in HEAD but
> > _not_ in those parents, showing the boundary commits. The "sed" call
> > lists the first such boundary commit (which must, by construction, be one
> > of the commits shown by the first rev-list).
>
> It almost works, thanks. In fact this is how I represent it in my
> head, but I couldn't find a working command (hint, hint, the
> --boundaries trick). Based on yours here it is the one I am using
> right now:
>
> oldremoteref="$(git rev-list --boundary HEAD --not \
> $(git rev-list -g $remoteref 2>/dev/null) |
> sed -e '/^[^-]/d' -e 's/^-//;q' )"
>
> i.e. without the ^@ as you want the commits in the reflog as boundary
> commits, and also remove the - in front of the commit.Thanks for fixing it. I should have mentioned that I did not test it (and usually stuff I do not test has blatant bugs in it, such as was the case here).
Show 14 quoted lines
> Your version performs equally than mine for the normal case but much
> better if it has to walk many reflog entries. Also mine has the problem,
> at least currently, that it does not give up as "git rev-parse -q
> --verify $branch@{n}" does not return an error when n is too large:
>
> $ git rev-parse -q --verify origin/next@{18} ; echo $?
> warning: Log for 'origin/next' only has 17 entries.
> 37eb784cfce07ba0048d64e352c5137454396d87
> 0
>
> even with "-q --verify"!
>
> So, I'll take yours and will send an updated patch (saying that is is
> based on a command by you). With your Signed-off-by?Maybe an ACK instead?
Thanks, Dscho