git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [wishlist] git submodule update --reset-hard

From
Stefan Beller <sbeller@google.com>
Date
Dec 6, 2018, 21:55 UTC
Message-ID
<CAGZ79kYoGqWW4tv4-caA18SHKe+y2mnDT84AEWVksDtDObLq0g@mail.gmail.com>
In-Reply-To
<20181206212459.GN4633@hopa.kiewit.dartmouth.edu>
On Thu, Dec 6, 2018 at 1:25 PM Yaroslav Halchenko <yoh@onerussian.com> wrote:
Show 18 quoted lines
>
>
> On Thu, 06 Dec 2018, Stefan Beller wrote:
>
> > On Thu, Dec 6, 2018 at 10:02 AM Yaroslav Halchenko <yoh@onerussian.com> wrote:
>
> > > Dear Git Gurus,
>
> > > I wondered what would be your take on my wishlist request to add
> > > --reset-hard option, which would be very similar to regular "update" which
> > > checks out necessary commit, but I want it to remain in the branch.
>
> > What if the branch differs from the sha1 recorded in the superproject?
>
> git reset --hard  itself is an operation which should be done with some
> level of competence in doing "the right thing" by calling it.  You
> can hop branches even in current (without any submodules in question)
> repository with it and cause as much chaos as you desire.
Right.

git reset --hard would the branch (as well as the working tree) to the given sha1, which is confusing as submodules get involved.

The Right Thing as of now is the sha1 as found in the superprojects gitlink. But as that can be different from any branch in the submodule, we'd rather detach the HEAD to make it deterministic.

There was a proposal to "re-attach HEAD" in the submodule, i.e. if the branch branch points at the same commit, we don't need a detached HEAD, but could go with the branch instead.

Show 7 quoted lines
> If desired though, a number of prevention mechanisms could be in place (but
> would require option(s) to overcome) to allow submodule to be reset --hard'ed
> only when some conditions met (e.g. only to the commit which is among parent
> commits path of the current branch).  This way wild hops would be prevented,
> although you might still end up in some feature branch.  But since "reset
> --hard" itself doesn't have any safe-guards, I do not really think they should
> be implemented here either.
So are you looking for
a) "stay on submodule branch (i.e. HEAD still points at $branch), and
reset --hard"
    such that the submodule has a clean index and at that $branch or
b) "stay on submodule branch (i.e. HEAD still points at $branch), but $branch is
   set to the gitlink from the superproject, and then a reset --hard
will have the worktree
   set to it as well.
(a) is what the referenced submodule.repoLike option implements.

I'd understand the desire for (b) as well, as it is a "real" hard reset on the superproject level, without detaching branches.

> >   git reset --hard --recurse-submodules HEAD
> it does indeed some trick(s) but not all seems to be the ones I desire:
>
> 1. Seems to migrate submodule's .git directories into the top level
> .git/modules

Ah yes, that happens too. This will help once you want to git-rm a submodule and checkout states before and after.

Show 7 quoted lines
> > undesirable in the sense of still having local changes (that is what
> > the above reset with `--recurse` would fix) or changed the branch
> > state? (i.e. is detached but was on a branch before?)
>
> right -- I meant the local changes and indeed reset --recurse-submodules
> indeed seems to recurse nicely.  Then the undesired effect remaining only
> the detached HEAD

For that we may want to revive discussions in https://public-inbox.org/git/20170501180058.8063-5-sbeller@google.com/

Show 16 quoted lines
> > >   git submodule update --recursive
>
> > > I would end up in the detached HEADs within submodules.
>
> > > What I want is to retain current branch they are at (or may be possible
> > > "were in"? reflog records might have that information)
>
> > So something like
>
> >   git submodule foreach --recursive git reset --hard
>
> > ?
>
> not quite  -- this would just kill all local changes within each submodule, not
> to reset it to the desired state, which wouldn't be specified in such
> invocation, and is only known to the repo containing it
With this answer it sounds like you'd want (b) from above.
Show 7 quoted lines
> > You may be interested in
> > https://public-inbox.org/git/20180927221603.148025-1-sbeller@google.com/
> > which introduces a switch `submodule.repoLike [ = true]`, which
> > when set would not detach HEAD in submodules.
>
> Thanks! looks interesting -- was there more discussion/activity beyond those 5
> posts in the thread?
Unfortunately there was not.
Show 25 quoted lines
> This feature might indeed come handy but if I got it right, it is somewhat
> complimentary to just having submodule update --reset-hard .  E.g.  submodules
> might be in different branches (if I am not tracking based on branch names), so
> I would not want a recursive checkout with -b|-B.  But we would indeed benefit
> from such functionality, since this difficulty of managing branches of
> submodules I think would be elevated with it! (e.g. in one use case we probably
> will end up with a few thousands of submodules, and at least 3 branches in each
> which would need to be in sync, and typically you wouldn't want different
> branches to be checked out in different submodules)
>
> > Can you say more about the first question above:
> > Would you typically have situations where the
> > submodule branch is out of sync with the superproject
> > and how do you deal with that?
>
> typically I do not have anything out of sync.  My primary use-case is to
> "cancel" recent changes in the entire tree of repositories.  I guess for
> my use case, instead of needing two commands
>
>    git reset --hard PREVIOUSPOINT
>    git submodule update --reset--hard --recursive
>
> I wish there was just one
>
>    git reset --hard --recursive PREVIOUSPOINT
Maybe this could learn options like
  git reset --hard --recursive=hard,keep-branch PREVIOUSPOINT
which then could be put into options like
  git config reset.recurseSubmodules  hard,keep-branch &&
  # maybe not needed, depending on the exact meaning
  # of reset.recurseSubmodules:
  git config submodule.recurse
and then
  git reset --hard PREVIOUS
would do what you'd desire.
Show 8 quoted lines
> but I felt that   submodule update   might be a better starting point
> since it already  provides different modes for update.  If I was even greedier,
> I would have asked for
>
>    git revert --recursive <commit>...
>    git rebase --recursive [-i] ...
>
> which I also frequently desire (could elaborate on the use cases etc).

These would be nice to have. It would be nice if you'd elaborate on the use cases for future reference in the mailing list archive. :-)

>
> NB or --recurse-submodules to avoid confusion with recursive merge
> strategy?
... and sometimes recursing in the file system, c.f. `ls-tree -r`.
Previous: Yaroslav HalchenkoNext: Yaroslav Halchenko
Message 4 of 18 in “[wishlist] git submodule update --reset-hard”
  1. Yaroslav HalchenkoDec 6, 2018
  2. Stefan BellerDec 6, 2018
  3. Yaroslav HalchenkoDec 6, 2018
  4. Stefan BellerDec 6, 2018
  5. Yaroslav HalchenkoDec 7, 2018
  6. Stefan BellerDec 7, 2018
  7. Yaroslav HalchenkoDec 8, 2018
  8. Yaroslav HalchenkoDec 8, 2018
  9. Stefan BellerDec 10, 2018
  10. Yaroslav HalchenkoDec 10, 2018
  11. 1/2 submodule: Add --reset-hard option for git submodule updateYaroslav Halchenko, Dec 11, 2018
  12. 2/2 RF+ENH(TST): compare the entire list of submodule status --recursive to stay intactYaroslav Halchenko, Dec 11, 2018
  13. Stefan BellerDec 12, 2018
  14. Yaroslav O HalchenkoDec 13, 2018
  15. Stefan BellerDec 13, 2018
  16. Yaroslav O HalchenkoDec 13, 2018
  17. Stefan BellerDec 13, 2018
  18. Yaroslav O HalchenkoDec 14, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.