 e4cfe74cd0
			
		
	
	e4cfe74cd0
	
	
	
		
			
			This developer spent a lot of time trying to speed up the interactive rebase, in particular on Windows. And will continue to do so. To make it easier to demonstrate the performance improvement, let's have a reproducible performance test. The topic branch we use to test performance was found using these shell commands (essentially searching for a long-enough topic branch in Git's own history that touched the same file multiple times): git rev-list --parents origin/master | grep ' .* ' | while read commit rest do patch_count=$(git rev-list --count $commit^..$commit^2) test $patch_count -gt 20 || continue merges="$(git rev-list --parents $commit^..$commit^2 | grep ' .* ')" test -z "$merges" || continue patches_per_file="$(git log --pretty=%H --name-only \ $commit^..$commit^2 | grep -v '^$' | sort | uniq -c -d | sort -n -r)" test -n "$patches_per_file" && test 20 -lt $(echo "$patches_per_file" | sed -n '1s/^ *\([0-9]*\).*/\1/p') || continue printf 'commit %s\n%s\n' "$commit" "$patches_per_file" done Note that we can get away with *not* having to reset to the original branch tip before rebasing: we switch the first two "pick" lines every time, so we end up with the same patch order after two rebases, and the complexity of both rebases is equivalent. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
		
			
				
	
	
		
			37 lines
		
	
	
		
			735 B
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			37 lines
		
	
	
		
			735 B
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/sh
 | |
| 
 | |
| test_description='Tests rebase -i performance'
 | |
| . ./perf-lib.sh
 | |
| 
 | |
| test_perf_default_repo
 | |
| 
 | |
| # This commit merges a sufficiently long topic branch for reasonable
 | |
| # performance testing
 | |
| branch_merge=ba5312da19c6fdb6c6747d479f58932aae6e900c^{commit}
 | |
| export branch_merge
 | |
| 
 | |
| git rev-parse --verify $branch_merge >/dev/null 2>&1 || {
 | |
| 	skip_all='skipping because $branch_merge was not found'
 | |
| 	test_done
 | |
| }
 | |
| 
 | |
| write_script swap-first-two.sh <<\EOF
 | |
| case "$1" in
 | |
| */COMMIT_EDITMSG)
 | |
| 	mv "$1" "$1".bak &&
 | |
| 	sed -e '1{h;d}' -e 2G <"$1".bak >"$1"
 | |
| 	;;
 | |
| esac
 | |
| EOF
 | |
| 
 | |
| test_expect_success 'setup' '
 | |
| 	git config core.editor "\"$PWD"/swap-first-two.sh\" &&
 | |
| 	git checkout -f $branch_merge^2
 | |
| '
 | |
| 
 | |
| test_perf 'rebase -i' '
 | |
| 	git rebase -i $branch_merge^
 | |
| '
 | |
| 
 | |
| test_done
 |