Revision d699676dda5fdf0996601006c3bac2a9c077a862 authored by Linus Torvalds on 10 August 2007, 19:31:20 UTC, committed by Junio C Hamano on 10 August 2007, 21:00:25 UTC
This trivially optimizes the two-way merge case of git-read-tree too,
which affects switching branches.

When you have tons and tons of files in your repository, but there are
only small differences in the branches (maybe just a couple of files
changed), the biggest cost of the branch switching was actually just the
index calculations.

This fixes it (timings for switching between the "testing" and "master"
branches in the 100,000 file testing-repo-from-hell, where the branches
only differ in one small file).

Before:
	[torvalds@woody bummer]$ time git checkout master
	real    0m9.919s
	user    0m8.461s
	sys     0m0.264s

After:
	[torvalds@woody bummer]$ time git checkout testing
	real    0m0.576s
	user    0m0.348s
	sys     0m0.228s

so it's easily an order of magnitude different.

This concludes the series. I think we could/should do the three-way merge
too (to speed up merges), but I'm lazy. Somebody else can do it.

The rule is very simple: you need to remove the old entry if:
 - you want to remove the file entirely
 - you replace it with a "merge conflict" entry (ie a non-stage-0 entry)

and you can avoid removing it if you either

 - keep the old one
 - or resolve it to a new one.

and these rules should all be valid for the three-way case too.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 288f072
History
File Mode Size
Documentation
arm
compat
contrib
git-gui
gitweb
mozilla-sha1
perl
ppc
t
templates
xdiff
.gitignore -rw-r--r-- 2.3 KB
.mailmap -rw-r--r-- 1.9 KB
COPYING -rw-r--r-- 18.3 KB
GIT-VERSION-GEN -rwxr-xr-x 757 bytes
INSTALL -rw-r--r-- 4.5 KB
Makefile -rw-r--r-- 31.3 KB
README -rw-r--r-- 2.1 KB
RelNotes l--------- 32 bytes
alloc.c -rw-r--r-- 1.7 KB
archive-tar.c -rw-r--r-- 8.2 KB
archive-zip.c -rw-r--r-- 8.9 KB
archive.h -rw-r--r-- 1.1 KB
attr.c -rw-r--r-- 13.2 KB
attr.h -rw-r--r-- 816 bytes
base85.c -rw-r--r-- 2.9 KB
blob.c -rw-r--r-- 1.1 KB
blob.h -rw-r--r-- 311 bytes
builtin-add.c -rw-r--r-- 5.5 KB
builtin-annotate.c -rw-r--r-- 446 bytes
builtin-apply.c -rw-r--r-- 69.5 KB
builtin-archive.c -rw-r--r-- 5.7 KB
builtin-blame.c -rw-r--r-- 60.9 KB
builtin-branch.c -rw-r--r-- 14.9 KB
builtin-bundle.c -rw-r--r-- 9.8 KB
builtin-cat-file.c -rw-r--r-- 3.4 KB
builtin-check-attr.c -rw-r--r-- 1.3 KB
builtin-check-ref-format.c -rw-r--r-- 282 bytes
builtin-checkout-index.c -rw-r--r-- 7.5 KB
builtin-commit-tree.c -rw-r--r-- 3.9 KB
builtin-config.c -rw-r--r-- 7.2 KB
builtin-count-objects.c -rw-r--r-- 2.9 KB
builtin-describe.c -rw-r--r-- 7.0 KB
builtin-diff-files.c -rw-r--r-- 958 bytes
builtin-diff-index.c -rw-r--r-- 1.2 KB
builtin-diff-tree.c -rw-r--r-- 3.3 KB
builtin-diff.c -rw-r--r-- 8.2 KB
builtin-fetch--tool.c -rw-r--r-- 12.8 KB
builtin-fmt-merge-msg.c -rw-r--r-- 7.8 KB
builtin-for-each-ref.c -rw-r--r-- 20.6 KB
builtin-fsck.c -rw-r--r-- 18.3 KB
builtin-gc.c -rw-r--r-- 2.5 KB
builtin-grep.c -rw-r--r-- 16.4 KB
builtin-init-db.c -rw-r--r-- 9.4 KB
builtin-log.c -rw-r--r-- 19.5 KB
builtin-ls-files.c -rw-r--r-- 12.1 KB
builtin-ls-tree.c -rw-r--r-- 4.4 KB
builtin-mailinfo.c -rw-r--r-- 19.1 KB
builtin-mailsplit.c -rw-r--r-- 5.8 KB
builtin-merge-base.c -rw-r--r-- 1.2 KB
builtin-merge-file.c -rw-r--r-- 1.6 KB
builtin-mv.c -rw-r--r-- 7.4 KB
builtin-name-rev.c -rw-r--r-- 6.4 KB
builtin-pack-objects.c -rw-r--r-- 47.2 KB
builtin-pack-refs.c -rw-r--r-- 3.4 KB
builtin-prune-packed.c -rw-r--r-- 1.8 KB
builtin-prune.c -rw-r--r-- 1.9 KB
builtin-push.c -rw-r--r-- 3.9 KB
builtin-read-tree.c -rw-r--r-- 6.7 KB
builtin-reflog.c -rw-r--r-- 9.8 KB
builtin-rerere.c -rw-r--r-- 11.0 KB
builtin-rev-list.c -rw-r--r-- 12.8 KB
builtin-rev-parse.c -rw-r--r-- 8.2 KB
builtin-revert.c -rw-r--r-- 10.1 KB
builtin-rm.c -rw-r--r-- 6.3 KB
builtin-runstatus.c -rw-r--r-- 833 bytes
builtin-shortlog.c -rw-r--r-- 7.4 KB
builtin-show-branch.c -rw-r--r-- 21.1 KB
builtin-show-ref.c -rw-r--r-- 5.8 KB
builtin-stripspace.c -rw-r--r-- 1.8 KB
builtin-symbolic-ref.c -rw-r--r-- 1.3 KB
builtin-tar-tree.c -rw-r--r-- 2.1 KB
builtin-unpack-objects.c -rw-r--r-- 8.6 KB
builtin-update-index.c -rw-r--r-- 19.2 KB
builtin-update-ref.c -rw-r--r-- 1.6 KB
builtin-upload-archive.c -rw-r--r-- 4.1 KB
builtin-verify-pack.c -rw-r--r-- 1.7 KB
builtin-write-tree.c -rw-r--r-- 2.2 KB
builtin.h -rw-r--r-- 5.5 KB
cache-tree.c -rw-r--r-- 12.5 KB
cache-tree.h -rw-r--r-- 921 bytes
cache.h -rw-r--r-- 21.1 KB
check-builtins.sh -rwxr-xr-x 588 bytes
check-racy.c -rw-r--r-- 517 bytes
color.c -rw-r--r-- 3.2 KB
color.h -rw-r--r-- 376 bytes
combine-diff.c -rw-r--r-- 26.4 KB
commit.c -rw-r--r-- 36.7 KB
commit.h -rw-r--r-- 3.8 KB
config.c -rw-r--r-- 22.5 KB
config.mak.in -rw-r--r-- 931 bytes
configure.ac -rw-r--r-- 12.4 KB
connect.c -rw-r--r-- 13.0 KB
convert-objects.c -rw-r--r-- 7.3 KB
convert.c -rw-r--r-- 14.9 KB
copy.c -rw-r--r-- 688 bytes
csum-file.c -rw-r--r-- 2.1 KB
csum-file.h -rw-r--r-- 515 bytes
ctype.c -rw-r--r-- 889 bytes
daemon.c -rw-r--r-- 26.7 KB
date.c -rw-r--r-- 18.0 KB
decorate.c -rw-r--r-- 1.8 KB
decorate.h -rw-r--r-- 382 bytes
delta.h -rw-r--r-- 3.4 KB
diff-delta.c -rw-r--r-- 13.6 KB
diff-lib.c -rw-r--r-- 17.0 KB
diff.c -rw-r--r-- 79.2 KB
diff.h -rw-r--r-- 7.0 KB
diffcore-break.c -rw-r--r-- 8.4 KB
diffcore-delta.c -rw-r--r-- 5.2 KB
diffcore-order.c -rw-r--r-- 2.2 KB
diffcore-pickaxe.c -rw-r--r-- 3.3 KB
diffcore-rename.c -rw-r--r-- 13.8 KB
diffcore.h -rw-r--r-- 3.8 KB
dir.c -rw-r--r-- 16.2 KB
dir.h -rw-r--r-- 1.9 KB
dump-cache-tree.c -rw-r--r-- 1.5 KB
entry.c -rw-r--r-- 5.7 KB
environment.c -rw-r--r-- 3.5 KB
exec_cmd.c -rw-r--r-- 2.8 KB
exec_cmd.h -rw-r--r-- 286 bytes
fast-import.c -rw-r--r-- 54.3 KB
fetch-pack.c -rw-r--r-- 17.6 KB
fetch.c -rw-r--r-- 6.7 KB
fetch.h -rw-r--r-- 1.6 KB
fixup-builtins -rwxr-xr-x 326 bytes
generate-cmdlist.sh -rwxr-xr-x 551 bytes
git-add--interactive.perl -rwxr-xr-x 16.0 KB
git-am.sh -rwxr-xr-x 11.1 KB
git-archimport.perl -rwxr-xr-x 35.8 KB
git-bisect.sh -rwxr-xr-x 8.3 KB
git-checkout.sh -rwxr-xr-x 6.7 KB
git-clean.sh -rwxr-xr-x 1.8 KB
git-clone.sh -rwxr-xr-x 10.8 KB
git-commit.sh -rwxr-xr-x 14.2 KB
git-compat-util.h -rw-r--r-- 8.0 KB
git-cvsexportcommit.perl -rwxr-xr-x 8.5 KB
git-cvsimport.perl -rwxr-xr-x 26.1 KB
git-cvsserver.perl -rwxr-xr-x 99.1 KB
git-fetch.sh -rwxr-xr-x 8.9 KB
git-filter-branch.sh -rwxr-xr-x 8.8 KB
git-instaweb.sh -rwxr-xr-x 5.2 KB
git-lost-found.sh -rwxr-xr-x 473 bytes
git-ls-remote.sh -rwxr-xr-x 2.5 KB
git-merge-octopus.sh -rwxr-xr-x 2.4 KB
git-merge-one-file.sh -rwxr-xr-x 3.3 KB
git-merge-ours.sh -rwxr-xr-x 335 bytes
git-merge-resolve.sh -rwxr-xr-x 956 bytes
git-merge-stupid.sh -rwxr-xr-x 1.4 KB
git-merge.sh -rwxr-xr-x 11.1 KB
git-mergetool.sh -rwxr-xr-x 8.4 KB
git-parse-remote.sh -rwxr-xr-x 5.8 KB
git-pull.sh -rwxr-xr-x 3.2 KB
git-quiltimport.sh -rwxr-xr-x 3.0 KB
git-rebase--interactive.sh -rwxr-xr-x 11.3 KB
git-rebase.sh -rwxr-xr-x 8.5 KB
git-relink.perl -rwxr-xr-x 4.0 KB
git-remote.perl -rwxr-xr-x 9.0 KB
git-repack.sh -rwxr-xr-x 2.8 KB
git-request-pull.sh -rwxr-xr-x 1.3 KB
git-reset.sh -rwxr-xr-x 2.3 KB
git-send-email.perl -rwxr-xr-x 18.0 KB
git-sh-setup.sh -rwxr-xr-x 2.7 KB
git-stash.sh -rwxr-xr-x 4.5 KB
git-submodule.sh -rwxr-xr-x 6.3 KB
git-svn.perl -rwxr-xr-x 114.7 KB
git-svnimport.perl -rwxr-xr-x 24.2 KB
git-tag.sh -rwxr-xr-x 4.0 KB
git-verify-tag.sh -rwxr-xr-x 763 bytes
git.c -rw-r--r-- 12.9 KB
git.spec.in -rw-r--r-- 8.0 KB
gitk -rwxr-xr-x 205.6 KB
grep.c -rw-r--r-- 12.7 KB
grep.h -rw-r--r-- 1.6 KB
hash-object.c -rw-r--r-- 1.9 KB
help.c -rw-r--r-- 4.6 KB
http-fetch.c -rw-r--r-- 25.9 KB
http-push.c -rw-r--r-- 66.5 KB
http.c -rw-r--r-- 11.4 KB
http.h -rw-r--r-- 2.5 KB
ident.c -rw-r--r-- 5.7 KB
imap-send.c -rw-r--r-- 28.5 KB
index-pack.c -rw-r--r-- 21.8 KB
interpolate.c -rw-r--r-- 2.0 KB
interpolate.h -rw-r--r-- 601 bytes
list-objects.c -rw-r--r-- 4.5 KB
list-objects.h -rw-r--r-- 382 bytes
local-fetch.c -rw-r--r-- 6.0 KB
lockfile.c -rw-r--r-- 4.4 KB
log-tree.c -rw-r--r-- 10.0 KB
log-tree.h -rw-r--r-- 386 bytes
mailmap.c -rw-r--r-- 2.2 KB
mailmap.h -rw-r--r-- 213 bytes
match-trees.c -rw-r--r-- 7.1 KB
merge-file.c -rw-r--r-- 2.4 KB
merge-index.c -rw-r--r-- 2.4 KB
merge-recursive.c -rw-r--r-- 44.3 KB
merge-tree.c -rw-r--r-- 7.9 KB
mktag.c -rw-r--r-- 3.7 KB
mktree.c -rw-r--r-- 3.1 KB
object-refs.c -rw-r--r-- 2.0 KB
object.c -rw-r--r-- 5.5 KB
object.h -rw-r--r-- 2.3 KB
pack-check.c -rw-r--r-- 5.1 KB
pack-redundant.c -rw-r--r-- 14.9 KB
pack-write.c -rw-r--r-- 4.7 KB
pack.h -rw-r--r-- 2.0 KB
pager.c -rw-r--r-- 1.2 KB
patch-delta.c -rw-r--r-- 2.2 KB
patch-id.c -rw-r--r-- 1.6 KB
patch-ids.c -rw-r--r-- 4.7 KB
patch-ids.h -rw-r--r-- 490 bytes
path-list.c -rw-r--r-- 2.2 KB
path-list.h -rw-r--r-- 597 bytes
path.c -rw-r--r-- 7.6 KB
peek-remote.c -rw-r--r-- 1.4 KB
pkt-line.c -rw-r--r-- 2.5 KB
pkt-line.h -rw-r--r-- 348 bytes
progress.c -rw-r--r-- 2.6 KB
progress.h -rw-r--r-- 605 bytes
quote.c -rw-r--r-- 8.0 KB
quote.h -rw-r--r-- 2.0 KB
reachable.c -rw-r--r-- 5.5 KB
reachable.h -rw-r--r-- 127 bytes
read-cache.c -rw-r--r-- 28.5 KB
receive-pack.c -rw-r--r-- 12.1 KB
reflog-walk.c -rw-r--r-- 6.7 KB
reflog-walk.h -rw-r--r-- 383 bytes
refs.c -rw-r--r-- 34.5 KB
refs.h -rw-r--r-- 2.4 KB
remote.c -rw-r--r-- 14.5 KB
remote.h -rw-r--r-- 1018 bytes
revision.c -rw-r--r-- 37.4 KB
revision.h -rw-r--r-- 3.1 KB
rsh.c -rw-r--r-- 1.7 KB
rsh.h -rw-r--r-- 158 bytes
run-command.c -rw-r--r-- 3.5 KB
run-command.h -rw-r--r-- 1.2 KB
send-pack.c -rw-r--r-- 10.2 KB
server-info.c -rw-r--r-- 5.2 KB
setup.c -rw-r--r-- 8.3 KB
sha1_file.c -rw-r--r-- 60.2 KB
sha1_name.c -rw-r--r-- 16.0 KB
shallow.c -rw-r--r-- 2.3 KB
shell.c -rw-r--r-- 1.1 KB
show-index.c -rw-r--r-- 2.1 KB
sideband.c -rw-r--r-- 1.9 KB
sideband.h -rw-r--r-- 335 bytes
ssh-fetch.c -rw-r--r-- 3.6 KB
ssh-pull.c -rw-r--r-- 154 bytes
ssh-push.c -rw-r--r-- 155 bytes
ssh-upload.c -rw-r--r-- 2.8 KB
strbuf.c -rw-r--r-- 767 bytes
strbuf.h -rw-r--r-- 216 bytes
symlinks.c -rw-r--r-- 862 bytes
tag.c -rw-r--r-- 2.8 KB
tag.h -rw-r--r-- 471 bytes
tar.h -rw-r--r-- 644 bytes
test-absolute-path.c -rw-r--r-- 147 bytes
test-chmtime.c -rw-r--r-- 1.2 KB
test-date.c -rw-r--r-- 378 bytes
test-delta.c -rw-r--r-- 1.8 KB
test-genrandom.c -rw-r--r-- 731 bytes
test-match-trees.c -rw-r--r-- 588 bytes
test-sha1.c -rw-r--r-- 815 bytes
test-sha1.sh -rwxr-xr-x 1.9 KB
trace.c -rw-r--r-- 3.9 KB
tree-diff.c -rw-r--r-- 10.8 KB
tree-walk.c -rw-r--r-- 4.3 KB
tree-walk.h -rw-r--r-- 1.2 KB
tree.c -rw-r--r-- 7.3 KB
tree.h -rw-r--r-- 860 bytes
unpack-file.c -rw-r--r-- 821 bytes
unpack-trees.c -rw-r--r-- 21.4 KB
unpack-trees.h -rw-r--r-- 940 bytes
update-server-info.c -rw-r--r-- 457 bytes
upload-pack.c -rw-r--r-- 16.3 KB
usage.c -rw-r--r-- 1.9 KB
utf8.c -rw-r--r-- 9.9 KB
utf8.h -rw-r--r-- 388 bytes
var.c -rw-r--r-- 1.3 KB
write_or_die.c -rw-r--r-- 2.3 KB
wt-status.c -rw-r--r-- 9.3 KB
wt-status.h -rw-r--r-- 566 bytes
xdiff-interface.c -rw-r--r-- 4.5 KB
xdiff-interface.h -rw-r--r-- 632 bytes

README

back to top