All of lore.kernel.org
 help / color / mirror / Atom feed
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

             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.