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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to