Skip to content

Commit

Permalink
Merge branch 'jk/filter-branch-no-index'
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Junio C Hamano committed Dec 4, 2015
2 parents 4672123 + 348d4f2 commit 2e5adec
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 2 deletions.
23 changes: 21 additions & 2 deletions git-filter-branch.sh
Original file line number Diff line number Diff line change
Expand Up @@ -306,14 +306,26 @@ then
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))

report_progress

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
Expand Down Expand Up @@ -387,8 +399,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

Expand Down
19 changes: 19 additions & 0 deletions t/perf/p7000-filter-branch.sh
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 2e5adec

Please sign in to comment.