From: Junio C Hamano Date: Fri, 24 Mar 2006 10:21:25 GMT Subject: Re: [PATCH] cogito: Avoid slowness when timewarping large trees. Message-ID: <7vd5gc16u2.fsf@assigned-by-dhcp.cox.net> In-Reply-To: <20060324084423.GA30213@coredump.intra.peff.net> Jeff King writes: > tree_timewarp was calling read, egrep, and rm in an O(N) loop where N is > the number of changed files between two trees. This caused a bottleneck > when seeking/switching/merging between trees with many changed files. >... > --- > > cg-Xlib | 9 +++------ > 1 files changed, 3 insertions(+), 6 deletions(-) > > a9a160c0bd63973c53ba3aa74650728135d23ac7 > diff --git a/cg-Xlib b/cg-Xlib > index a2f28cf..ceddeeb 100644 > --- a/cg-Xlib > +++ b/cg-Xlib > @@ -345,12 +345,9 @@ tree_timewarp() > > # Kill gone files > git-diff-tree -r "$base" "$branch" | > ... > + # match ":100755 000000 14d43b1abf... 000000000... D" > + sed -ne 's/^:\([^ ][^ ]* \)\{4\}D\t//p' | > + xargs rm -- > git-checkout-index -u -f -a Metainformation fields are internally separated with SP and a TAB comes before pathname; you can just say: sed -ne 's/^:[^ ]* D //p' there (whitespace inside [] and after D are TAB; one before D is a SP). You might also want to consider "xargs rm -f --", BTW. However, I wonder why it does not do this instead: ... stash away the local changes git-read-tree -m "$base" ;# reset the index to $base # switch to $branch -- removing gone files as well git-read-tree -m -u "$base" "$branch" Then you can also lose diff-tree and checkout-index there.