From: Mike Hommey <mh@glandium.org>
To: git@vger.kernel.org
Subject: git branch --contains is slow with a lot of branches
Date: Tue, 31 Mar 2015 10:45:11 +0900 [thread overview]
Message-ID: <20150331014511.GA28418@glandium.org> (raw)
Hi,
Sometimes I want to know what (possibly remote) branch contains a given
commit. The repository where I do that has thousands of branches:
$ git for-each-ref | wc -l
7657
And a lot of commits:
$ git rev-list --all | wc -l
538174
Using git branch --contains can be a very expensive thing:
$ time git branch --contains 0812b94 --all > /dev/null
real 3m0.871s
user 3m0.828s
sys 0m0.084s
I'd argue this shouldn't take much more time than enumerating all revs:
$ time git rev-list --all | wc -l
538174
real 0m4.842s
user 0m4.488s
sys 0m1.332s
This can be reproduced to a certain degree with the git git repo:
$ git clone https://github.com/git/git
$ cd git
$ for i in $(seq 1 1000); do git branch branch$i master; done
$ git gc # will pack the refs
$ time git rev-list --all | wc -l
40886
real 0m0.505s
user 0m0.464s
sys 0m0.108s
$ time git branch --contains v2.0.0 > /dev/null
real 0m6.207s
user 0m6.204s
sys 0m0.004s
(especially in this case where all branches point to the same commit)
It's also essentially linear on the number of branches:
$ for i in $(seq 1001 7000); do git branch branch$i master; done
$ git gc
$ time git rev-list --all | wc -l
40886
real 0m0.493s
user 0m0.484s
sys 0m0.076s
$ time git branch --contains v2.0.0 > /dev/null
real 0m43.446s
user 0m43.436s
sys 0m0.040s
Mike
next reply other threads:[~2015-03-31 1:45 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-31 1:45 Mike Hommey [this message]
2015-03-31 3:03 ` git branch --contains is slow with a lot of branches Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150331014511.GA28418@glandium.org \
--to=mh@glandium.org \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.