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

Re: Automatically re-running commands during an interactive rebase or post commit

From
Son Luong Ngoc <sluongng@gmail.com>
Date
May 30, 2023, 07:22 UTC
Message-ID
<CAL3xRKfj6R9BfnKEcEqcD5Z+y_A1uocSgEsPyoaV95VXenjHbQ@mail.gmail.com>
In-Reply-To
<CACoUkn7TmZ=trtDKcQm0SG5qCqK=-+YxrDV-7xYnLH_XK7K7og@mail.gmail.com>
Hey Paul,
On Mon, May 29, 2023 at 3:44 PM Paul Jolly <paul@myitcv.io> wrote:
Show 5 quoted lines
>
> Hi all,
>
> I would appreciate some advice on the best way to solve the following problem.
>
...
Show 23 quoted lines
>
> I've tried to experiment with how I might do this using git commit
> hooks. But so far, my git foo is failing me. It mainly fails because
> when doing an edit of an earlier commit via an interactive rebase,
> later changes might well conflict (in the generated file) with the
> results of the code generator having been re-run on the edited commit.
> At this point, my git rebase --continue stops until I have fixed the
> conflict. But in almost all situations, the conflict comes in the
> generated hash file. Which I fix by simply re-running the code
> generation script (I could optionally fix it by doing a git checkout
> --theirs, and then re-running the code generation script).
>
> This all feels tantalisingly close to being a perfect workflow! But I
> can't quite figure out how to make the git hooks "work" in such a way
> that doesn't require any intervention from me (except in those
> situations where there is a conflict during the rebase that is _not_
> in the code generated file and so does require my intervention).
>
> The code generation step is incredibly fast if there is nothing to do,
> and is quite fast even when there is something to do (in any case it
> can't avoid doing this work).
>
> Please can someone help nudge me in the right direction?
In general, there are 2 cases that you would want to handle:
1. Inserting format directive in between commit rebase that DOES NOT
    come with merge conflicts
2. Same but DOES come with merge conflicts.
For (1), you might be interested in tools such as
- Git Absorb(a) that automatically fixup your stack of commits with your
  current dirty changes.
- Git Branchless(b) "git test" feature

Both of these tools are heavily influenced by Meta's internal Phabricator mercurial workflow. Since the release of these tools, Meta has also open-sourced their internal tool at Sapling SCM(c) which they touted to be git-compatible.

For (2), and if none of the tools above solve your problem, then I recommend using git-rebase interactive with a vim macro to generate the needed rebase todo. You can find my comment in (d) to see what such a rebase todo list would look like.

Tools such as Restack (e) take it a step further by providing a custom Git `sequence.editor` to programmatically generate the rebase todo for you. This could be a bash script, or a perl script... or a custom Go binary of your choosing. You might want to go down this route if a vim macro is not sufficient and you require some custom logic.

Finally, I would recommend turning on rerere.enabled (f) config to store the conflict resolution for subsequent rebase attempts. This way, you would only need to resolve each rebase conflict once.

(a): https://github.com/tummychow/git-absorb (b): https://github.com/arxanas/git-branchless/wiki/Command:-git-test#fixing-formatting-and-linting-issues (c): https://sapling-scm.com/docs/commands/absorb (d): https://github.com/arxanas/git-branchless/discussions/45#discussioncomment-3364792 (e): https://github.com/abhinav/restack (f): https://git-scm.com/docs/git-config#Documentation/git-config.txt-rerereenabled

Show 5 quoted lines
>
> Many thanks,
>
>
> Paul

Cheers, Son Luong.

Previous: Paul JollyNext: Oswald Buddenhagen
Message 11 of 13 in “Automatically re-running commands during an interactive rebase or post commit”
  1. Paul JollyMay 29, 2023
  2. rsbecker@nexbridge.comMay 29, 2023
  3. Paul JollyMay 29, 2023
  4. Paul JollyMay 29, 2023
  5. Phillip WoodMay 29, 2023
  6. Paul JollyMay 29, 2023
  7. Phillip WoodMay 29, 2023
  8. Elijah NewrenMay 31, 2023
  9. Phillip WoodJun 2, 2023
  10. Paul JollyJun 8, 2023
  11. Son Luong NgocMay 30, 2023
  12. Oswald BuddenhagenMay 30, 2023
  13. Paul JollyMay 30, 2023

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.