On Mon, 2017-03-13 at 14:19 -0700, Stefan Beller wrote:
> > > The change is not really lost, as you can get it via
> > >
> > > git checkout HEAD@{1}
> > > git submodule update --init
> >
> > Sure, the commit isn't lost entirely. But a mixed reset is often
> > used
> > to mean "go back to before I committed", and here, that's not
> > precisely
> > what's happening.
>
> Well, you ran the deinit after the commit, so I don't think
> we expect to undo everything up to "just before the commit".
Sure, but other workdir changes after the commit would have been blown
away; so why not this one?
> > > * lack of --recurse-submodules in git-reset? (and that not
> > > being default, see prior point)
> >
> > Or possibly this.
>
> Well even in this case a reset recursing into submodules doesn't
> change the (de-)init status of a submodule. All it would alter is the
> submodule HEAD pointing to, IMHO.
That's OK with me. It's weird, but at least it's explicable.
> > For me, the bug (if any) is the bad user experience of doing a
> > mixed
> > reset and expecting to be able to commit (possibly with some git-
> > add
> > operations) from there and get back something like the commit to
> > which
> > the user had git-reset.
>
> Technically this is also doable,
>
> git reset --mixed HEAD^ # as in the original email
> git update-index --add --cacheinfo \
> 160000,$(git -C .git/modules/sub1 rev-parse HEAD),sub1
> git add another_file
> git commit -m "recreate the commit"
Yeah, unless the user had done various other operations that messed
with .git/modules/sub1 (e.g. if they had first checked out another
branch with --recurse-submodules).
Also, this updates the index, which a mixed reset isn't supposed to
touch.
> > That's why I have the question mark there -- it's not clear that
> > this
> > is a reasonable expectation.
>
> Fuzzing around with gitlinks that are non-populated submodules is
> a messy business.
Agreed.
> So another way would be to populate the submodule manually
>
> GIT_DIR=.git/modules/sub1 \
> GIT_WORKTREE=sub1 \
> git checkout -f # implies last HEAD
>
> and then continue in the superproject.
(see above for why this is not a general solution)
> I am making up excuses for poor UX here, though.
> I do agree that the expectations may vary wildly because of poor UX
> in submodules.
I agree that it's not quite clear what to expect. I can just say that
I was quite surprised when my colleague demoed this one for me.