summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2015-12-04 19:19:10 (GMT)
committerJunio C Hamano <gitster@pobox.com>2015-12-04 19:19:10 (GMT)
commit2e5adec97a65ce8c2c803b9e1cbb1c0d067e7e47 (patch)
treeeacdbdd6d3972bef4437457c7cebafac0c4d4c68
parent4672123fe5cb629d2a261245fd0a2e003ef35ea3 (diff)
parent348d4f2fc5d3c4f7ba47079b96676b4e2dd831fc (diff)
downloadgit-2e5adec97a65ce8c2c803b9e1cbb1c0d067e7e47.zip
git-2e5adec97a65ce8c2c803b9e1cbb1c0d067e7e47.tar.gz
git-2e5adec97a65ce8c2c803b9e1cbb1c0d067e7e47.tar.bz2
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
-rwxr-xr-xgit-filter-branch.sh23
-rwxr-xr-xt/perf/p7000-filter-branch.sh19
2 files changed, 40 insertions, 2 deletions
diff --git a/git-filter-branch.sh b/git-filter-branch.sh
index cefd145..98f1779 100755
--- a/git-filter-branch.sh
+++ b/git-filter-branch.sh
@@ -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
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
} <../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
diff --git a/t/perf/p7000-filter-branch.sh b/t/perf/p7000-filter-branch.sh
new file mode 100755
index 0000000..15ee5d1
--- /dev/null
+++ b/t/perf/p7000-filter-branch.sh
@@ -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