Browse Source

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
maint
Junio C Hamano 9 years ago
parent
commit
2e5adec97a
  1. 23
      git-filter-branch.sh
  2. 19
      t/perf/p7000-filter-branch.sh

23
git-filter-branch.sh

@ -306,6 +306,15 @@ then @@ -306,6 +306,15 @@ 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))

@ -313,7 +322,10 @@ while read commit parents; do @@ -313,7 +322,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 +399,15 @@ while read commit parents; do @@ -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


19
t/perf/p7000-filter-branch.sh

@ -0,0 +1,19 @@ @@ -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
Loading…
Cancel
Save