Re: [PATCH v3 15/15] rebase: change the default backend from "am" to "merge"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jan 16, 2020 at 2:39 PM Jonathan Nieder <jrnieder@xxxxxxxxx> wrote:
> [...]
> >>  B. stop running the post-commit hook in rebase
> >
> > AND sometimes in both cherry-pick and git-revert, depending on the
> > number of commit(s) picked/reverted (see below).
>
> Interesting.  Doesn't "git cherry-pick A..B" run post-commit after
> each commit today?  It would be possible to do (B) and retain that
> behavior.

Sure, it'd be possible to retain the post-commit calls for cherry-pick
but should we?  Isn't the primary reason the issue came up that having
batch-commit operations calling post-commit for each intermediate
commit is ugly/unexpected overhead?  If we're ripping it out of rebase
for that reason, it seems that cherry-pick should get the same
treatment.  I don't want to just move the inconsistencies around, I
want to fix them.

> > Also, even if we go this route, I think the post-commit hook should be
> > added to git-merge whenever it creates a merge commit.
>
> Agreed.

Yay!

> >>     Advantages:
> >>     * makes --am and --merge consistent with minimal user impact
> >
> > ...and also makes --interactive and --exec and other cases consistent too.
>
> Hm.  My initial thought with (B) was to stop running post-commit in
> non-interactive rebase but keep running it in rebase --interactive.
>
> I don't have a strong opinion about this, though.

I'm okay with treating them differently if there's a defining reason
why, but otherwise I think they should all behave the same.  The only
reasons I've seen for differences all fall in category C so far, which
gives me a strong opinion against treating them differently.

> >>     Disadvantages:
> >>     * meaning of the post-commit hook remains a muddle
> >
> > Why?  "Commands which create no more than one commit (git-commit,
> > git-merge, maybe single-commit git-revert or git-cherry-pick) call
> > post-commit, commands which create several commits derived from others
> > (git-am, git-rebase, git-cherry-pick, sometimes git-revert ) call
> > post-rewrite instead for performance reasons"
>
> Example: if I run "git revert A..B", following that rule we'd want to
> call post-rewrite instead of post-commit.  But post-rewrite gets input
>
>         <old-sha1> SP <new-sha1> [ SP <extra-info> ] LF
>
> so that it can be used to copy data such as notes.  What do I pass in as
> <old-sha1>?
>
> Relatedly, if I remember correctly, we don't call post-rewrite in "git
> cherry-pick" because cherry-pick is considered to represent a *new*
> commit instead of a modified version of the old one.  In C++ terms,
> it's a copy constructor instead of a move constructor. ;-)  See
> notes.rewrite.* in "git help notes" for more on that subject.

Ah, I see.  Yeah, there's some impedance mismatch between the
purpose/definition of the post-rewrite hook and what I think is needed
for B.  Perhaps create a new post-batch-commit hook
("batch-post-commit"?) and have git-rebase, git-am, git-cherry-pick,
git-revert, etc. call it while git-commit and git-merge call
post-commit.  (Or maybe even make git-commit and git-merge also call
post-batch-commit/batch-post-commit but do so with just one commit --
and just note that post-commit's design of not taking any parameters
was a mistake and any place that happens to call it beyond
"git-commit/git-merge" is solely by accident of past implementation
and is not guaranteed to continue.)

I think the realm of "copy constructor vs. move constructor" may make
sense for post-rewrite-hook, but I'm worried that trying to apply that
logic to notification of new commits may lead us into category C
craziness.

> [...]
> >>  C. stop running the post-commit hook in rebase --merge or commit --amend
> >>
> >>     Advantages:
> >>     * produces a consistent definition of post-commit ("it's about new
> >>       commits only")
> >
> > But cherry-pick never creates "new" commits if commit --amend doesn't,
> > so we'd also want to turn the post-commit hook off for cherry-pick,
> > right?
>
> With the copy/modify distinction described above, "git commit --amend"
> acts as a "modify" operation in a user's workflow, while "git
> cherry-pick" acts as a "copy" operation.
>
> That means that with this definition, post-commit is appropriate to
> run in cherry-pick but not in commit --amend.

What if there are conflicts?  Because with conflicts, aren't
cherry-picks more like the 'commit --amend' case since they behave as
a "modify"?  Conflict-dependent invoking of the post-commit hook?

> This matches the distinction used by note rewriting and the
> post-rewrite hook.  Looking back at the discussion in
> https://lore.kernel.org/git/cover.1266164150.git.trast@xxxxxxxxxxxxxxx/
> I don't see this covered, so it's possible I'm remembering wrong (a
> pointer to the motivating discussion that inspired that patch series
> would be welcome).  In the context of note copying, this distinction
> ended up being a good decision in practice in most workflows I've
> seen.

Yeah, for note copying that distinction makes a lot of sense to me.
For "notification of new commits", it doesn't seem to jive at all for
me.

> [...]
> >>     Disadvantages:
> >>     * the change to historical "git commit --amend" behavior is likely
> >>       to be surprising
> >
> > That is certainly one issue, but I'd say this case is riddled with
> > problems and is the most muddled of all.
>
> I'm inclined to agree, based on the "git commit --amend" example.
>
> [...]
> > I think it was useful to phrase it this way and list the various
> > advantages, disadvantages, and mitigations; thanks.
> >
> > Is there anything I've missed in my additional details?  Anything
> > sound crazy (beyond what I said I think case C leads to)?
>
> To sum it up, I lean toward (B), but (A) is not so bad, either
> (especially with the "I need some time to adapt to the change" opt-out
> config described under mitigations).

Sounds like we might be starting to converge towards a similar
opinion.  I roughly feel the same with leaning towards something like
(B) _if_ we can address the inconsistencies rather than just shuffle
them around (meaning we also turn off post-commit for interactive
rebase and cherry-pick) and move all of them over to some kind of
batch-commit-notification mechanism.

> Thanks for patiently working it through with me.
>
> My two cents,
> Jonathan

Likewise.  :-)
Elijah



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux