On Thu, Nov 05, 2015 at 07:18:32PM -0500, Jeff King wrote: > Of course that leaves only the problem that filter-branch is > horrendously slow (for the kernel, most of the time goes to populating > the index for each commit; I think filter-branch could probably learn to > skip this step if there is no index or tree filter at work). Here's a totally untested patch that seems to make a filter-branch like this on the kernel orders of magnitude faster: diff --git a/git-filter-branch.sh b/git-filter-branch.sh index 27c9c54..9df5185 100755 --- a/git-filter-branch.sh +++ b/git-filter-branch.sh @@ -306,6 +306,13 @@ then start_timestamp=$(date '+%s') fi +if test -n "$filter_index" || test -n "$filter_tree" +then + need_index=t +else + need_index= +fi + while read commit parents; do git_filter_branch__commit_count=$(($git_filter_branch__commit_count+1)) @@ -313,7 +320,10 @@ while read commit parents; do case "$filter_subdir" in "") - GIT_ALLOW_NULL_SHA1=1 git read-tree -i -m $commit + if test -n "$need_index" + then + GIT_ALLOW_NULL_SHA1=1 git read-tree -i -m $commit + fi ;; *) # The commit may not have the subdirectory at all @@ -387,8 +397,15 @@ while read commit parents; do } <../commit | eval "$filter_msg" > ../message || die "msg filter failed: $filter_msg" + + if test -n "$need_index" + then + tree=$(git write-tree) + else + tree="$commit^{tree}" + fi workdir=$workdir @SHELL_PATH@ -c "$filter_commit" "git commit-tree" \ - $(git write-tree) $parentstr < ../message > ../map/$commit || + "$tree" $parentstr < ../message > ../map/$commit || die "could not write rewritten commit" done <../revs -- To unsubscribe from this list: 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