Merge branch 'jk/filter-branch-no-index'

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
This commit is contained in:
Junio C Hamano 2015-12-04 11:19:10 -08:00
commit 2e5adec97a
2 changed files with 40 additions and 2 deletions

View File

@ -306,6 +306,15 @@ then
start_timestamp=$(date '+%s') start_timestamp=$(date '+%s')
fi 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 while read commit parents; do
git_filter_branch__commit_count=$(($git_filter_branch__commit_count+1)) git_filter_branch__commit_count=$(($git_filter_branch__commit_count+1))
@ -313,7 +322,10 @@ while read commit parents; do
case "$filter_subdir" in 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 # The commit may not have the subdirectory at all
@ -387,8 +399,15 @@ while read commit parents; do
} <../commit | } <../commit |
eval "$filter_msg" > ../message || eval "$filter_msg" > ../message ||
die "msg filter failed: $filter_msg" 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" \ 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" die "could not write rewritten commit"
done <../revs done <../revs

19
t/perf/p7000-filter-branch.sh Executable file
View File

@ -0,0 +1,19 @@
#!/bin/sh
test_description='performance of filter-branch'
. ./perf-lib.sh
test_perf_default_repo
test_checkout_worktree
test_expect_success 'mark bases for tests' '
git tag -f tip &&
git tag -f base HEAD~100
'
test_perf 'noop filter' '
git checkout --detach tip &&
git filter-branch -f base..HEAD
'
test_done