On Tue, Oct 04, 2016 at 07:44:28AM -0400, Jeff King wrote: > > My idea of a solution goes like this: > > * collect all SHA1's of the remotes refs > > * check if we have them locally > > * if not we abort and tell the user to fetch them somehow into local > > refs or disable the check > > * when we have them locally we proceed passing those SHA1's as bases > > instead of --remotes=<name> > > As I argued in [1], I think it's not just "this must be cheaper" but > "this must not be enabled if submodules are not in use at all". Most > repositories don't have submodules enabled at all, so anything that > cause any extra traversal, even of a portion of the history, is going to > be a net negative for a lot of people. > > I think the only sane default is going to be some kind of heuristic that > says "submodules are probably in use". Something like "is there a > .gitmodules file" is not perfect (you can have gitlink entries without > it), but it's a really cheap constant-time check. I agree. We are adding convenience for submodules, so we can also say a checked out ".gitmodules" file is a must to have convenience. I am not sure if I agree on another layer of options for this as suggested in your post. More options mean more implementation complexity and more confusion on the users side. How about we choose our defaults based on the existence of a checked out .gitmodules file? So the default would only be --recurse-submodules=check if there is a .gitmodules file in the worktree. All other users need to either pass or explicitly configure it. Cheers Heiko > [1] Quoted in > http://public-inbox.org/git/xmqqh9aaot49.fsf@xxxxxxxxxxxxxxxxxxxxxxxxxxx/