On Thu, Aug 3, 2017 at 1:37 PM, Junio C Hamano <gitster@xxxxxxxxx> wrote: > Brandon Williams <bmwill@xxxxxxxxxx> writes: > >> The 'submodule.update' config was historically used and respected by the >> 'submodule update' command because update handled a variety of different >> ways it updated a submodule. As we begin teaching other commands about >> submodules it makes more sense for the different settings of >> 'submodule.update' to be handled by the individual commands themselves >> (checkout, rebase, merge, etc) so it shouldn't be respected by the >> native checkout command. > > Soooo... what's the externally observable effect of this change? Is > it something that can be illustrated in a set of new tests? The illustration can be as follows git config submodule.NAME.update none git checkout -f --recurse-submodules HEAD git status # observe dirty submodule, which is # not what checkout -f promises > IOW does this commit by itself want to change the behaviour of > "submodule update" and existing (indirect) users of unpack-trees? > Or does it want to keep the documented behaviour of "submodule > update" while correcting unintended triggering in other (indirect) > users of unpack-trees of the same machinery that is being removed in > this patch? "submodule update" is unaffected, only the recently introduced submodule awareness of checkout/reset/read-tree are changed. This option is documented as submodule.<name>.update The default update procedure for a submodule. This variable is populated by git submodule init from the gitmodules(5) file. See description of update command in git-submodule(1). which doesn't indicate that any other command apart from "submodule update" should respect it. > >> - switch (sub->update_strategy.type) { >> - case SM_UPDATE_UNSPECIFIED: >> - case SM_UPDATE_CHECKOUT: >> - if (submodule_move_head(ce->name, old_id, new_id, flags)) >> - return o->gently ? -1 : >> - add_rejected_path(o, ERROR_WOULD_LOSE_SUBMODULE, ce->name); >> - return 0; >> - case SM_UPDATE_NONE: >> - return 0; >> - case SM_UPDATE_REBASE: >> - case SM_UPDATE_MERGE: >> - case SM_UPDATE_COMMAND: >> - default: >> - warning(_("submodule update strategy not supported for submodule '%s'"), ce->name); >> - return -1; >> - } >> + if (submodule_move_head(ce->name, old_id, new_id, flags)) >> + return o->gently ? -1 : >> + add_rejected_path(o, ERROR_WOULD_LOSE_SUBMODULE, ce->name); >> + return 0; > > With this update, we always behave as if update_strategy.type were > either left unspecified or explicitly set to checkout. Other arms > in this switch (and the other switch too), especially "none", were > not expecting a call to submodule_move_head() to be made, but now > the call is unconditional. > Yes. This is because each command (reset/checkout) should provide one expected behavior. It is not that we can configure reset to omit certain (tracked) files from being reset?