* [RFH] rebase -i optimization @ 2009-02-26 14:55 Sverre Rabbelier 2009-02-26 14:59 ` Johannes Schindelin 2009-02-27 1:10 ` [RFH] rebase -i optimization Sitaram Chamarty 0 siblings, 2 replies; 16+ messages in thread From: Sverre Rabbelier @ 2009-02-26 14:55 UTC (permalink / raw) To: Johannes Schindelin, Junio C Hamano, Stephen Haberman, Shawn O. Pearce, Thomas Cc: Git Mailing List, Stephan Beyer, Christian Couder, Daniel Barkalow Heya, I am currently working on a large set of patches for Melange, and as such I'm using rebase -i a lot to polish things a bit. I do this mainly by 'git rebase -i master' from my topic branch, then change on of the 'pick' lines into an 'edit', and then fix up the commit and 'git rebase --continue'. Now I notice I'm waiting a lot for 'rebase -i' to finish picking the first bunch of commits that I didn't change. Now obviously I couldof done 'git rebase -i <foo>', but then I have first figure out what the last commit I want to change is. Would there be a reason to not reset to the last 'pick' commit instead of to the 'based on' branch (as long as there history is linear)? If so, what would be the best way to go around and implement this? (to's based on who made the most changes to git-rebase--interactive.sh and cc-ed those involved with git-sequencer) -- Cheers, Sverre Rabbelier ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFH] rebase -i optimization 2009-02-26 14:55 [RFH] rebase -i optimization Sverre Rabbelier @ 2009-02-26 14:59 ` Johannes Schindelin 2009-02-26 15:33 ` Sverre Rabbelier 2009-02-27 1:10 ` [RFH] rebase -i optimization Sitaram Chamarty 1 sibling, 1 reply; 16+ messages in thread From: Johannes Schindelin @ 2009-02-26 14:59 UTC (permalink / raw) To: Sverre Rabbelier Cc: Junio C Hamano, Stephen Haberman, Shawn O. Pearce, Thomas Rast, Git Mailing List, Stephan Beyer, Christian Couder, Daniel Barkalow Hi, On Thu, 26 Feb 2009, Sverre Rabbelier wrote: > I am currently working on a large set of patches for Melange, and as > such I'm using rebase -i a lot to polish things a bit. I do this > mainly by 'git rebase -i master' from my topic branch, then change on > of the 'pick' lines into an 'edit', and then fix up the commit and > 'git rebase --continue'. Now I notice I'm waiting a lot for 'rebase > -i' to finish picking the first bunch of commits that I didn't change. > Now obviously I couldof done 'git rebase -i <foo>', but then I have > first figure out what the last commit I want to change is. > Would there be a reason to not reset to the last 'pick' commit instead > of to the 'based on' branch (as long as there history is linear)? If > so, what would be the best way to go around and implement this? This code is supposed to do exactly what you want: http://repo.or.cz/w/git/dscho.git?a=blob;f=git-rebase--interactive.sh;h=532f161c1ddce351cf623b096899e0eb057180ca;hb=8394eb1ecee00c2aba9212f3445c42078b41614b#l198 Unfortunately, it seems to be quite broken by all the different directions rebase -i was pulled to, but maybe you see the bug right away. Otherwise, I'll try to reschedule my Git time budget later tonight. Ciao, Dscho ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFH] rebase -i optimization 2009-02-26 14:59 ` Johannes Schindelin @ 2009-02-26 15:33 ` Sverre Rabbelier 2009-02-27 10:50 ` Johannes Schindelin 0 siblings, 1 reply; 16+ messages in thread From: Sverre Rabbelier @ 2009-02-26 15:33 UTC (permalink / raw) To: Johannes Schindelin Cc: Junio C Hamano, Stephen Haberman, Shawn O. Pearce, Thomas Rast, Git Mailing List, Stephan Beyer, Christian Couder, Daniel Barkalow Heya, On Thu, Feb 26, 2009 at 15:59, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote: > This code is supposed to do exactly what you want: Hmmm, I can't say I understand it 100%, but what I can see from reading the code and looking at the output of 'rebase -i -v' is that it does a 'git reset --hard' on each commit if it was already applied, instead of figuring out beforehand what to reset to? If that is the case, it might still take a long time to do the rebase if it takes long to do the 'reset --hard' between the patches (say, if a big change is made). > Unfortunately, it seems to be quite broken by all the different directions > rebase -i was pulled to, but maybe you see the bug right away. Otherwise, > I'll try to reschedule my Git time budget later tonight. After reading the code and trying with -v, I don't think the current code is broken, just that it might be optimized to be even faster? -- Cheers, Sverre Rabbelier ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFH] rebase -i optimization 2009-02-26 15:33 ` Sverre Rabbelier @ 2009-02-27 10:50 ` Johannes Schindelin 2009-02-27 12:29 ` Sverre Rabbelier 2009-02-27 12:56 ` [PATCH] rebase -i: avoid 'git reset' when possible Johannes Schindelin 0 siblings, 2 replies; 16+ messages in thread From: Johannes Schindelin @ 2009-02-27 10:50 UTC (permalink / raw) To: Sverre Rabbelier Cc: Junio C Hamano, Stephen Haberman, Shawn O. Pearce, Thomas Rast, Git Mailing List, Stephan Beyer, Christian Couder, Daniel Barkalow Hi, On Thu, 26 Feb 2009, Sverre Rabbelier wrote: > On Thu, Feb 26, 2009 at 15:59, Johannes Schindelin > <Johannes.Schindelin@gmx.de> wrote: > > This code is supposed to do exactly what you want: > > Hmmm, I can't say I understand it 100%, but what I can see from > reading the code and looking at the output of 'rebase -i -v' is that > it does a 'git reset --hard' on each commit if it was already applied, > instead of figuring out beforehand what to reset to? If that is the > case, it might still take a long time to do the rebase if it takes > long to do the 'reset --hard' between the patches (say, if a big > change is made). Right. I am of two minds here: On one hand, I could imagine that it is just a question of skipping those 'pick' commands that do not contribute anything. That would be a pretty simple function that would be called at the very beginning. On the other hand, this very simple strategy would fail pretty quickly (and badly) with -i -p. And that is the stuff I am mostly spending my Git time budget on these days. Having said that, I think yours might be such a common case that it is worth optimizing for. Ciao, Dscho ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFH] rebase -i optimization 2009-02-27 10:50 ` Johannes Schindelin @ 2009-02-27 12:29 ` Sverre Rabbelier 2009-02-27 12:56 ` [PATCH] rebase -i: avoid 'git reset' when possible Johannes Schindelin 1 sibling, 0 replies; 16+ messages in thread From: Sverre Rabbelier @ 2009-02-27 12:29 UTC (permalink / raw) To: Johannes Schindelin Cc: Junio C Hamano, Stephen Haberman, Shawn O. Pearce, Thomas Rast, Git Mailing List, Stephan Beyer, Christian Couder, Daniel Barkalow Heya, On Fri, Feb 27, 2009 at 11:50, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote: > On one hand, I could imagine that it is just a question of skipping those > 'pick' commands that do not contribute anything. That would be a pretty > simple function that would be called at the very beginning. Exactly, that's what I had in mind. > On the other hand, this very simple strategy would fail pretty quickly > (and badly) with -i -p. And that is the stuff I am mostly spending my Git > time budget on these days. I would be fine with making this optimization optional (with a config option?), and barf if both the optimization and -p are supplied. We could even automagically ignore the config option for -p, and only barf if both -p and this option are specified explicitly? > Having said that, I think yours might be such a common case that it is > worth optimizing for. Does this fit in your git time budget, or would you prefer I have a stab at it? If the latter, any hints on where to put such a call? -- Cheers, Sverre Rabbelier ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH] rebase -i: avoid 'git reset' when possible 2009-02-27 10:50 ` Johannes Schindelin 2009-02-27 12:29 ` Sverre Rabbelier @ 2009-02-27 12:56 ` Johannes Schindelin 2009-02-27 13:03 ` Sverre Rabbelier 2009-03-01 8:38 ` Junio C Hamano 1 sibling, 2 replies; 16+ messages in thread From: Johannes Schindelin @ 2009-02-27 12:56 UTC (permalink / raw) To: Sverre Rabbelier Cc: Junio C Hamano, Stephen Haberman, Shawn O. Pearce, Thomas Rast, Git Mailing List, Stephan Beyer, Christian Couder, Daniel Barkalow When picking commits whose parents have not changed, we do not need to rewrite the commit. We do not need to reset the working directory to the parent's state, either. Requested by Sverre Rabbelier. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> --- On Fri, 27 Feb 2009, Johannes Schindelin wrote: > Having said that, I think yours might be such a common case that > it is worth optimizing for. And so I did. git-rebase--interactive.sh | 23 +++++++++++++++++++++++ t/t3404-rebase-interactive.sh | 11 +++++++++++ 2 files changed, 34 insertions(+), 0 deletions(-) diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 3dc659d..a9617a2 100755 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -442,6 +442,27 @@ do_rest () { done } +# skip picking commits whose parents are unchanged +skip_unnecessary_picks () { + current=$ONTO + i=0 + while read command sha1 rest + do + test pick = "$command" && + test $current = "$(git rev-parse $sha1^)" || + break + current=$(git rev-parse $sha1) + i=$(($i+1)) + done < "$TODO" + test $i = 0 || { + sed -e "${i}q" < "$TODO" >> "$DONE" && + sed -e "1,${i}d" < "$TODO" >> "$TODO".new && + mv -f "$TODO".new "$TODO" && + ONTO=$current || + die "Could not skip $i pick commands" + } +} + # check if no other options are set is_standalone () { test $# -eq 2 -a "$2" = '--' && @@ -746,6 +767,8 @@ EOF has_action "$TODO" || die_abort "Nothing to do" + test -d "$REWRITTEN" || skip_unnecessary_picks + git update-ref ORIG_HEAD $HEAD output git checkout $ONTO && do_rest ;; diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh index 603b003..c32ff66 100755 --- a/t/t3404-rebase-interactive.sh +++ b/t/t3404-rebase-interactive.sh @@ -459,4 +459,15 @@ test_expect_success 'submodule rebase -i' ' FAKE_LINES="1 squash 2 3" git rebase -i A ' +test_expect_success 'avoid unnecessary reset' ' + git checkout master && + test-chmtime =123456789 file3 && + git update-index --refresh && + HEAD=$(git rev-parse HEAD) && + git rebase -i HEAD~4 && + test $HEAD = $(git rev-parse HEAD) && + MTIME=$(test-chmtime -v +0 file3 | sed 's/[^0-9].*$//') && + test 123456789 = $MTIME +' + test_done -- 1.6.2.rc1.350.g6caf6 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH] rebase -i: avoid 'git reset' when possible 2009-02-27 12:56 ` [PATCH] rebase -i: avoid 'git reset' when possible Johannes Schindelin @ 2009-02-27 13:03 ` Sverre Rabbelier 2009-02-27 13:33 ` Johannes Schindelin 2009-03-01 8:38 ` Junio C Hamano 1 sibling, 1 reply; 16+ messages in thread From: Sverre Rabbelier @ 2009-02-27 13:03 UTC (permalink / raw) To: Johannes Schindelin Cc: Junio C Hamano, Stephen Haberman, Shawn O. Pearce, Thomas Rast, Git Mailing List, Stephan Beyer, Christian Couder, Daniel Barkalow Heya, On Fri, Feb 27, 2009 at 13:56, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote: > When picking commits whose parents have not changed, we do not need to > rewrite the commit. We do not need to reset the working directory to > the parent's state, either. Awesome, I will give this a spin when I get home. >> Having said that, I think yours might be such a common case that >> it is worth optimizing for. > > And so I did. Very nice, I don't think I couldof done it anywhere near as fast ;). -- Cheers, Sverre Rabbelier ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] rebase -i: avoid 'git reset' when possible 2009-02-27 13:03 ` Sverre Rabbelier @ 2009-02-27 13:33 ` Johannes Schindelin 0 siblings, 0 replies; 16+ messages in thread From: Johannes Schindelin @ 2009-02-27 13:33 UTC (permalink / raw) To: Sverre Rabbelier Cc: Junio C Hamano, Stephen Haberman, Shawn O. Pearce, Thomas Rast, Git Mailing List, Stephan Beyer, Christian Couder, Daniel Barkalow [-- Attachment #1: Type: TEXT/PLAIN, Size: 436 bytes --] Hi, On Fri, 27 Feb 2009, Sverre Rabbelier wrote: > On Fri, Feb 27, 2009 at 13:56, Johannes Schindelin > <Johannes.Schindelin@gmx.de> wrote: > > >> Having said that, I think yours might be such a common case that it > >> is worth optimizing for. > > > > And so I did. > > Very nice, I don't think I couldof done it anywhere near as fast ;). Heh, the time I save now that I read less mails... :-) It's more fun, too. Ciao, Dscho ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] rebase -i: avoid 'git reset' when possible 2009-02-27 12:56 ` [PATCH] rebase -i: avoid 'git reset' when possible Johannes Schindelin 2009-02-27 13:03 ` Sverre Rabbelier @ 2009-03-01 8:38 ` Junio C Hamano 2009-03-01 21:57 ` Johannes Schindelin 1 sibling, 1 reply; 16+ messages in thread From: Junio C Hamano @ 2009-03-01 8:38 UTC (permalink / raw) To: Johannes Schindelin Cc: Sverre Rabbelier, Stephen Haberman, Shawn O. Pearce, Thomas Rast, Git Mailing List, Stephan Beyer, Christian Couder, Daniel Barkalow Johannes Schindelin <Johannes.Schindelin@gmx.de> writes: > diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh > index 3dc659d..a9617a2 100755 > --- a/git-rebase--interactive.sh > +++ b/git-rebase--interactive.sh > @@ -442,6 +442,27 @@ do_rest () { > done > } > > +# skip picking commits whose parents are unchanged > +skip_unnecessary_picks () { > + current=$ONTO > + i=0 > + while read command sha1 rest > + do > + test pick = "$command" && > + test $current = "$(git rev-parse $sha1^)" || > + break > + current=$(git rev-parse $sha1) > + i=$(($i+1)) > + done < "$TODO" > + test $i = 0 || { > + sed -e "${i}q" < "$TODO" >> "$DONE" && > + sed -e "1,${i}d" < "$TODO" >> "$TODO".new && > + mv -f "$TODO".new "$TODO" && > + ONTO=$current || > + die "Could not skip $i pick commands" > + } > +} I do not think you have to count and then run two sed. this=$ONTO skip_pick=t while read command sha1 rest do sha1=$(git rev-parse "$sha1") case "$skip_pick,$command" in t,pick | t,p) if test "$this" = "$sha1" then echo >&3 "$command $sha1 $rest" this="$sha1" continue fi esac skip_pick=f echo "$command $sha1 $rest" done <"$TODO" >"$TODO.new" 3>>"$DONE" && ... ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] rebase -i: avoid 'git reset' when possible 2009-03-01 8:38 ` Junio C Hamano @ 2009-03-01 21:57 ` Johannes Schindelin 2009-03-03 0:57 ` Junio C Hamano 0 siblings, 1 reply; 16+ messages in thread From: Johannes Schindelin @ 2009-03-01 21:57 UTC (permalink / raw) To: Junio C Hamano Cc: Sverre Rabbelier, Stephen Haberman, Shawn O. Pearce, Thomas Rast, Git Mailing List, Stephan Beyer, Christian Couder, Daniel Barkalow Hi, On Sun, 1 Mar 2009, Junio C Hamano wrote: > Johannes Schindelin <Johannes.Schindelin@gmx.de> writes: > > > diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh > > index 3dc659d..a9617a2 100755 > > --- a/git-rebase--interactive.sh > > +++ b/git-rebase--interactive.sh > > @@ -442,6 +442,27 @@ do_rest () { > > done > > } > > > > +# skip picking commits whose parents are unchanged > > +skip_unnecessary_picks () { > > + current=$ONTO > > + i=0 > > + while read command sha1 rest > > + do > > + test pick = "$command" && > > + test $current = "$(git rev-parse $sha1^)" || > > + break > > + current=$(git rev-parse $sha1) > > + i=$(($i+1)) > > + done < "$TODO" > > + test $i = 0 || { > > + sed -e "${i}q" < "$TODO" >> "$DONE" && > > + sed -e "1,${i}d" < "$TODO" >> "$TODO".new && > > + mv -f "$TODO".new "$TODO" && > > + ONTO=$current || > > + die "Could not skip $i pick commands" > > + } > > +} > > I do not think you have to count and then run two sed. > > this=$ONTO > skip_pick=t > while read command sha1 rest > do > sha1=$(git rev-parse "$sha1") > case "$skip_pick,$command" in > t,pick | t,p) > if test "$this" = "$sha1" > then > echo >&3 "$command $sha1 $rest" > this="$sha1" > continue > fi > esac > skip_pick=f > echo "$command $sha1 $rest" > done <"$TODO" >"$TODO.new" 3>>"$DONE" && > ... Or even current=$ONTO fd=3 while read command sha1 rest do case "$fd,$command,$current" in 3,pick,"$sha1"*|t,p,"$sha1"*) current=$sha1 ;; *) fd=1 ;; esac echo "$command $sha1 $rest" >&$fd done < "$TODO" > "$TODO.new" 3>> "$DONE" && mv "$TODO.new" "$TODO" Hmm? Ciao, Dscho ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] rebase -i: avoid 'git reset' when possible 2009-03-01 21:57 ` Johannes Schindelin @ 2009-03-03 0:57 ` Junio C Hamano 2009-03-03 9:24 ` Johannes Schindelin 0 siblings, 1 reply; 16+ messages in thread From: Junio C Hamano @ 2009-03-03 0:57 UTC (permalink / raw) To: Johannes Schindelin Cc: Sverre Rabbelier, Stephen Haberman, Shawn O. Pearce, Thomas Rast, Git Mailing List, Stephan Beyer, Christian Couder, Daniel Barkalow Johannes Schindelin <Johannes.Schindelin@gmx.de> writes: > Or even > > current=$ONTO > fd=3 > while read command sha1 rest > do > case "$fd,$command,$current" in > 3,pick,"$sha1"*|t,p,"$sha1"*) > current=$sha1 > ;; > *) > fd=1 > ;; > esac > echo "$command $sha1 $rest" >&$fd > done < "$TODO" > "$TODO.new" 3>> "$DONE" && > mv "$TODO.new" "$TODO" > > Hmm? Certainly. Even though "3 means we haven't found a non-pick yet" feels slightly hacky, the logic is contained in this small loop and I do not see it as a problem. As long as you are sure $ONTO and all sha1 can be compared without running them through rev-parse, avoiding rev-parse per iteration is a very attractive optimization. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] rebase -i: avoid 'git reset' when possible 2009-03-03 0:57 ` Junio C Hamano @ 2009-03-03 9:24 ` Johannes Schindelin 2009-03-03 9:55 ` [PATCH v2] " Johannes Schindelin 0 siblings, 1 reply; 16+ messages in thread From: Johannes Schindelin @ 2009-03-03 9:24 UTC (permalink / raw) To: Junio C Hamano Cc: Sverre Rabbelier, Stephen Haberman, Shawn O. Pearce, Thomas Rast, Git Mailing List, Stephan Beyer, Christian Couder, Daniel Barkalow Hi, On Mon, 2 Mar 2009, Junio C Hamano wrote: > Johannes Schindelin <Johannes.Schindelin@gmx.de> writes: > > > Or even > > > > current=$ONTO > > fd=3 > > while read command sha1 rest > > do > > case "$fd,$command,$current" in > > 3,pick,"$sha1"*|t,p,"$sha1"*) > > current=$sha1 > > ;; > > *) > > fd=1 > > ;; > > esac > > echo "$command $sha1 $rest" >&$fd > > done < "$TODO" > "$TODO.new" 3>> "$DONE" && > > mv "$TODO.new" "$TODO" > > > > Hmm? > > Certainly. > > Even though "3 means we haven't found a non-pick yet" feels slightly > hacky, the logic is contained in this small loop and I do not see it as a > problem. I'll add a one line comment. > As long as you are sure $ONTO and all sha1 can be compared without > running them through rev-parse, avoiding rev-parse per iteration is a > very attractive optimization. Yes, that is the beauty of abbreviated commit names: they are guaranteed to be unique, unless other objects were added since, which is not the case at this point. Ciao, Dscho ^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v2] rebase -i: avoid 'git reset' when possible 2009-03-03 9:24 ` Johannes Schindelin @ 2009-03-03 9:55 ` Johannes Schindelin 2009-03-03 11:19 ` Johannes Sixt 0 siblings, 1 reply; 16+ messages in thread From: Johannes Schindelin @ 2009-03-03 9:55 UTC (permalink / raw) To: Junio C Hamano Cc: Sverre Rabbelier, Stephen Haberman, Shawn O. Pearce, Thomas Rast, Git Mailing List, Stephan Beyer, Christian Couder, Daniel Barkalow When picking commits whose parents have not changed, we do not need to rewrite the commit. We do not need to reset the working directory to the parent's state, either. Requested by Sverre Rabbelier. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> --- Actually, I did not think things through. Of _course_ we need that rev-parse, to determine the parent of the to-be-picked commit. Changes since v1: use only one loop instead of counting the number of skipped commits first, and then actually skipping them. git-rebase--interactive.sh | 26 ++++++++++++++++++++++++++ t/t3404-rebase-interactive.sh | 11 +++++++++++ 2 files changed, 37 insertions(+), 0 deletions(-) diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 3dc659d..72f7fc7 100755 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -442,6 +442,30 @@ do_rest () { done } +# skip picking commits whose parents are unchanged +skip_unnecessary_picks () { + fd=3 + while read command sha1 rest + do + # fd=3 means we skip the command + case "$fd,$command,$(git rev-parse --verify --quiet $sha1^)" in + 3,pick,"$ONTO"*|t,p,"$ONTO"*) + # pick a commit whose parent is current $ONTO -> skip + ONTO=$sha1 + ;; + 3,#*|3,,*) + # copy comments + ;; + *) + fd=1 + ;; + esac + echo "$command${sha1:+ }$sha1${rest:+ }$rest" >&$fd + done < "$TODO" > "$TODO.new" 3>> "$DONE" && + mv -f "$TODO".new "$TODO" || + die "Could not skip unnecessary pick commands" +} + # check if no other options are set is_standalone () { test $# -eq 2 -a "$2" = '--' && @@ -746,6 +770,8 @@ EOF has_action "$TODO" || die_abort "Nothing to do" + test -d "$REWRITTEN" || skip_unnecessary_picks + git update-ref ORIG_HEAD $HEAD output git checkout $ONTO && do_rest ;; diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh index 603b003..c32ff66 100755 --- a/t/t3404-rebase-interactive.sh +++ b/t/t3404-rebase-interactive.sh @@ -459,4 +459,15 @@ test_expect_success 'submodule rebase -i' ' FAKE_LINES="1 squash 2 3" git rebase -i A ' +test_expect_success 'avoid unnecessary reset' ' + git checkout master && + test-chmtime =123456789 file3 && + git update-index --refresh && + HEAD=$(git rev-parse HEAD) && + git rebase -i HEAD~4 && + test $HEAD = $(git rev-parse HEAD) && + MTIME=$(test-chmtime -v +0 file3 | sed 's/[^0-9].*$//') && + test 123456789 = $MTIME +' + test_done -- 1.6.2.rc1.456.g3dbe7 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v2] rebase -i: avoid 'git reset' when possible 2009-03-03 9:55 ` [PATCH v2] " Johannes Schindelin @ 2009-03-03 11:19 ` Johannes Sixt 2009-03-03 11:21 ` Johannes Schindelin 0 siblings, 1 reply; 16+ messages in thread From: Johannes Sixt @ 2009-03-03 11:19 UTC (permalink / raw) To: Johannes Schindelin Cc: Junio C Hamano, Sverre Rabbelier, Stephen Haberman, Shawn O. Pearce, Thomas Rast, Git Mailing List, Stephan Beyer, Christian Couder, Daniel Barkalow Johannes Schindelin schrieb: > +# skip picking commits whose parents are unchanged > +skip_unnecessary_picks () { > + fd=3 > + while read command sha1 rest > + do > + # fd=3 means we skip the command > + case "$fd,$command,$(git rev-parse --verify --quiet $sha1^)" in > + 3,pick,"$ONTO"*|t,p,"$ONTO"*) s/t,/3,/ > + # pick a commit whose parent is current $ONTO -> skip > + ONTO=$sha1 > + ;; > + 3,#*|3,,*) > + # copy comments > + ;; > + *) > + fd=1 > + ;; > + esac > + echo "$command${sha1:+ }$sha1${rest:+ }$rest" >&$fd > + done < "$TODO" > "$TODO.new" 3>> "$DONE" && > + mv -f "$TODO".new "$TODO" || > + die "Could not skip unnecessary pick commands" > +} -- Hannes ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v2] rebase -i: avoid 'git reset' when possible 2009-03-03 11:19 ` Johannes Sixt @ 2009-03-03 11:21 ` Johannes Schindelin 0 siblings, 0 replies; 16+ messages in thread From: Johannes Schindelin @ 2009-03-03 11:21 UTC (permalink / raw) To: Johannes Sixt Cc: Junio C Hamano, Sverre Rabbelier, Stephen Haberman, Shawn O. Pearce, Thomas Rast, Git Mailing List, Stephan Beyer, Christian Couder, Daniel Barkalow Hi, On Tue, 3 Mar 2009, Johannes Sixt wrote: > Johannes Schindelin schrieb: > > +# skip picking commits whose parents are unchanged > > +skip_unnecessary_picks () { > > + fd=3 > > + while read command sha1 rest > > + do > > + # fd=3 means we skip the command > > + case "$fd,$command,$(git rev-parse --verify --quiet $sha1^)" in > > + 3,pick,"$ONTO"*|t,p,"$ONTO"*) > > s/t,/3,/ Bah! Of course, I had to insert a typo there! Thanks! Dscho ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [RFH] rebase -i optimization 2009-02-26 14:55 [RFH] rebase -i optimization Sverre Rabbelier 2009-02-26 14:59 ` Johannes Schindelin @ 2009-02-27 1:10 ` Sitaram Chamarty 1 sibling, 0 replies; 16+ messages in thread From: Sitaram Chamarty @ 2009-02-27 1:10 UTC (permalink / raw) To: git On 2009-02-26, Sverre Rabbelier <srabbelier@gmail.com> wrote: > I am currently working on a large set of patches for Melange, and as > such I'm using rebase -i a lot to polish things a bit. I do this > mainly by 'git rebase -i master' from my topic branch, then change on > of the 'pick' lines into an 'edit', and then fix up the commit and > 'git rebase --continue'. Now I notice I'm waiting a lot for 'rebase > -i' to finish picking the first bunch of commits that I didn't change. > Now obviously I couldof done 'git rebase -i <foo>', but then I have > first figure out what the last commit I want to change is. you could, in theory, do it with a custom "EDITOR" variable that actually points to a script you write. This script will invoke the normal editor just as now, but if it finds that the resulting file has pick line(s) before the first edit line, it aborts the rebase by sending back an empty file, and print out a suitable rebase command that you just click-and-paste :-) Any other combination it just sends through as normal (like if the first non-pick line was a 'squash', for instance). Yes this is a kludge but it gets your job done with a minimum of fuss asap. Regards, Sitaram PS: Even more fun... I tested a script that looks like this: #!/bin/bash vim "$@" # -- parse $1 (which will be # .git/rebase-merge/rebase-todo # really) to pick the correct SHA you need -- unset EDITOR git rebase --abort git rebase -i the-SHA-you-picked When it finishes the inner rebase it does protest mildly (something about grep not finding that same file), a remnant of the outer rebase... but it seems to work fine. This removes even the extra step of having the outer rebase print something that you have to then copy/paste :-) ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2009-03-03 11:23 UTC | newest] Thread overview: 16+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-02-26 14:55 [RFH] rebase -i optimization Sverre Rabbelier 2009-02-26 14:59 ` Johannes Schindelin 2009-02-26 15:33 ` Sverre Rabbelier 2009-02-27 10:50 ` Johannes Schindelin 2009-02-27 12:29 ` Sverre Rabbelier 2009-02-27 12:56 ` [PATCH] rebase -i: avoid 'git reset' when possible Johannes Schindelin 2009-02-27 13:03 ` Sverre Rabbelier 2009-02-27 13:33 ` Johannes Schindelin 2009-03-01 8:38 ` Junio C Hamano 2009-03-01 21:57 ` Johannes Schindelin 2009-03-03 0:57 ` Junio C Hamano 2009-03-03 9:24 ` Johannes Schindelin 2009-03-03 9:55 ` [PATCH v2] " Johannes Schindelin 2009-03-03 11:19 ` Johannes Sixt 2009-03-03 11:21 ` Johannes Schindelin 2009-02-27 1:10 ` [RFH] rebase -i optimization Sitaram Chamarty
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).