Merge branch 'jk/filter-branch-no-index'
authorJunio C Hamano <gitster@pobox.com>
Fri, 4 Dec 2015 19:19:10 +0000 (11:19 -0800)
committerJunio C Hamano <gitster@pobox.com>
Fri, 4 Dec 2015 19:19:10 +0000 (11:19 -0800)
Speed up filter-branch for cases where we only care about rewriting
commits, not tree data.

* jk/filter-branch-no-index:
filter-branch: skip index read/write when possible

1  2 
git-filter-branch.sh
diff --combined git-filter-branch.sh
index cefd1452c66663fee9b00d1406b1d4f14e7964ac,d61f9baceb1bad4e70d8871ce491161e974c1c3c..98f1779cf3241fa12300fbf3dc0c4eff8ab10b61
@@@ -306,6 -306,15 +306,15 @@@ the
        start_timestamp=$(date '+%s')
  fi
  
+ if test -n "$filter_index" ||
+    test -n "$filter_tree" ||
+    test -n "$filter_subdir"
+ then
+       need_index=t
+ else
+       need_index=
+ fi
  while read commit parents; do
        git_filter_branch__commit_count=$(($git_filter_branch__commit_count+1))
  
  
        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
                        die "tree filter failed: $filter_tree"
  
                (
 -                      git diff-index -r --name-only --ignore-submodules $commit &&
 +                      git diff-index -r --name-only --ignore-submodules $commit -- &&
                        git ls-files --others
                ) > "$tempdir"/tree-state || exit
                git update-index --add --replace --remove --stdin \
        } <../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