Jeff King <peff@xxxxxxxx> 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. - : send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html