fast-export and fast-import can easily handle the simple rewrite that
was being done by filter-branch, and should be significantly faster on
systems with a slow fork.  Timings from before and after on a few
laptops that I or others measured on (measured via `time
./t3427-rebase-subtree.sh`, i.e. including everything in this test --
not just the filter-branch or fast-export/fast-import pair):

   Linux:    4.305s -> 3.684s (~17% speedup)
   Mac:     10.128s -> 7.038s (~30% speedup)
   Windows:  1m 37s -> 1m 17s (~26% speedup)

Signed-off-by: Elijah Newren <new...@gmail.com>
---
 t/t3427-rebase-subtree.sh | 24 +++++++++++++++---------
 1 file changed, 15 insertions(+), 9 deletions(-)

diff --git a/t/t3427-rebase-subtree.sh b/t/t3427-rebase-subtree.sh
index d8640522a0..c1f6102921 100755
--- a/t/t3427-rebase-subtree.sh
+++ b/t/t3427-rebase-subtree.sh
@@ -7,10 +7,16 @@ This test runs git rebase and tests the subtree strategy.
 . ./test-lib.sh
 . "$TEST_DIRECTORY"/lib-rebase.sh
 
-commit_message() {
+commit_message () {
        git log --pretty=format:%s -1 "$1"
 }
 
+extract_files_subtree () {
+       git fast-export --no-data HEAD -- files_subtree/ |
+               sed -e "s%\([0-9a-f]\{40\} \)files_subtree/%\1%" |
+               git fast-import --force --quiet
+}
+
 test_expect_success 'setup' '
        test_commit README &&
        mkdir files &&
@@ -42,7 +48,7 @@ test_expect_failure REBASE_P \
        'Rebase -Xsubtree --preserve-merges --onto commit 4' '
        reset_rebase &&
        git checkout -b rebase-preserve-merges-4 master &&
-       git filter-branch --prune-empty -f --subdirectory-filter files_subtree 
&&
+       extract_files_subtree &&
        git commit -m "Empty commit" --allow-empty &&
        git rebase -Xsubtree=files_subtree --preserve-merges --onto 
files-master master &&
        verbose test "$(commit_message HEAD~)" = "files_subtree/master4"
@@ -53,7 +59,7 @@ test_expect_failure REBASE_P \
        'Rebase -Xsubtree --preserve-merges --onto commit 5' '
        reset_rebase &&
        git checkout -b rebase-preserve-merges-5 master &&
-       git filter-branch --prune-empty -f --subdirectory-filter files_subtree 
&&
+       extract_files_subtree &&
        git commit -m "Empty commit" --allow-empty &&
        git rebase -Xsubtree=files_subtree --preserve-merges --onto 
files-master master &&
        verbose test "$(commit_message HEAD)" = "files_subtree/master5"
@@ -64,7 +70,7 @@ test_expect_failure REBASE_P \
        'Rebase -Xsubtree --keep-empty --preserve-merges --onto commit 4' '
        reset_rebase &&
        git checkout -b rebase-keep-empty-4 master &&
-       git filter-branch --prune-empty -f --subdirectory-filter files_subtree 
&&
+       extract_files_subtree &&
        git commit -m "Empty commit" --allow-empty &&
        git rebase -Xsubtree=files_subtree --keep-empty --preserve-merges 
--onto files-master master &&
        verbose test "$(commit_message HEAD~2)" = "files_subtree/master4"
@@ -75,7 +81,7 @@ test_expect_failure REBASE_P \
        'Rebase -Xsubtree --keep-empty --preserve-merges --onto commit 5' '
        reset_rebase &&
        git checkout -b rebase-keep-empty-5 master &&
-       git filter-branch --prune-empty -f --subdirectory-filter files_subtree 
&&
+       extract_files_subtree &&
        git commit -m "Empty commit" --allow-empty &&
        git rebase -Xsubtree=files_subtree --keep-empty --preserve-merges 
--onto files-master master &&
        verbose test "$(commit_message HEAD~)" = "files_subtree/master5"
@@ -86,7 +92,7 @@ test_expect_failure REBASE_P \
        'Rebase -Xsubtree --keep-empty --preserve-merges --onto empty commit' '
        reset_rebase &&
        git checkout -b rebase-keep-empty-empty master &&
-       git filter-branch --prune-empty -f --subdirectory-filter files_subtree 
&&
+       extract_files_subtree &&
        git commit -m "Empty commit" --allow-empty &&
        git rebase -Xsubtree=files_subtree --keep-empty --preserve-merges 
--onto files-master master &&
        verbose test "$(commit_message HEAD)" = "Empty commit"
@@ -96,7 +102,7 @@ test_expect_failure REBASE_P \
 test_expect_failure 'Rebase -Xsubtree --onto commit 4' '
        reset_rebase &&
        git checkout -b rebase-onto-4 master &&
-       git filter-branch --prune-empty -f --subdirectory-filter files_subtree 
&&
+       extract_files_subtree &&
        git commit -m "Empty commit" --allow-empty &&
        git rebase -Xsubtree=files_subtree --onto files-master master &&
        verbose test "$(commit_message HEAD~2)" = "files_subtree/master4"
@@ -106,7 +112,7 @@ test_expect_failure 'Rebase -Xsubtree --onto commit 4' '
 test_expect_failure 'Rebase -Xsubtree --onto commit 5' '
        reset_rebase &&
        git checkout -b rebase-onto-5 master &&
-       git filter-branch --prune-empty -f --subdirectory-filter files_subtree 
&&
+       extract_files_subtree &&
        git commit -m "Empty commit" --allow-empty &&
        git rebase -Xsubtree=files_subtree --onto files-master master &&
        verbose test "$(commit_message HEAD~)" = "files_subtree/master5"
@@ -115,7 +121,7 @@ test_expect_failure 'Rebase -Xsubtree --onto commit 5' '
 test_expect_failure 'Rebase -Xsubtree --onto empty commit' '
        reset_rebase &&
        git checkout -b rebase-onto-empty master &&
-       git filter-branch --prune-empty -f --subdirectory-filter files_subtree 
&&
+       extract_files_subtree &&
        git commit -m "Empty commit" --allow-empty &&
        git rebase -Xsubtree=files_subtree --onto files-master master &&
        verbose test "$(commit_message HEAD)" = "Empty commit"
-- 
2.23.0.39.gf92d9de5c3

Reply via email to