Re: [PATCHv2] push: change submodule default to check
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Aug 24, 2016, 19:37 UTC
- Message-ID
- <xmqqh9aaot49.fsf@gitster.mtv.corp.google.com>
- In-Reply-To
- <20160824183112.ceekegpzavnbybxp@sigill.intra.peff.net>
Jeff King <peff@peff.net> writes:
This seems to be dropped from the list, probably due to no "To:" header in the original, which led to "no", "To-header" "on" and "input <" on YOUR recipient list, so I am quoting it in full without trimming.
Show 48 quoted lines
> On Wed, Aug 24, 2016 at 10:30:17AM -0700, Stefan Beller wrote: > >> When working with submodules, it is easy to forget to push the submodules. >> The setting 'check', which checks if any existing submodule is present on >> at least one remote of the submodule remotes, is designed to prevent this >> mistake. >> >> Flipping the default to check for submodules is safer than the current >> default of ignoring submodules while pushing. > > It is safer, and that's good. But it's also slower, because it requires > an extra traversal of all of the pushed commits. And now people will > have to pay the price even if they are not using submodules at all. > > For instance, try this from a checkout of linux.git: > > for i in no check; do > rm -rf dst.git > git init --bare dst.git > echo "==> Pushing with submodules=$i" > time git push --recurse-submodules=$i dst.git HEAD > done > > The second case takes 30-40 seconds longer. This is a full push of > history, so it's an extreme case[1], but it's still rather unfortunate. > > Can we tie this default to some sign that submodules are actually in > use? I don't think the presence of .gitmodules is perfect (because you > might be in a bare repo, for example, and have just fetched some other > history you are relaying), but it may be a good compromise. I'm > envisioning something like "--recurse-submodules=auto-check" which > auto-detects common situations (e.g., presence of .gitmodules or > .git/modules checkouts) and enables "check", and then setting the > default to that in the long run. > > -Peff > > [1] Actually, there is another much worse case lurking there. Try: > > git push --recurse-submodules=check --mirror dst.git > > from the kernel. I didn't let it finish, but I'd estimate it would > take on the order of 5 hours. The problem is that push feeds each > updated ref tip to find_unpushed_submodules(), so we end up walking > over the same history over and over. > > I think it should feed all of the "before" and "after" ref tips it > proposes to update to a _single_ revision traversal.
That sounds massively ... broken. So before even thinking about flipping it to default, this needs to be fixed first.
Show 11 quoted lines
> I also notice that it uses "--remote=...", which is weird, because > push knows exactly what it proposes to update, which may be ahead of > where our refs/remotes/* cache is. Not to mention that we may be > pushing to a remote for which we do not keep tracking refs at all! > > So I'd actually suspect that with your patch, a bare URL like: > > git push https://github.com/peff/linux.git > > would do the full 40-second walk, even if I was only pushing up one > or two objects.