Elijah Newren <newren@xxxxxxxxx> writes: > On Wed, Aug 26, 2020 at 5:24 PM Junio C Hamano <gitster@xxxxxxxxx> wrote: >> >> Junio C Hamano <gitster@xxxxxxxxx> writes: >> >> > ... If "git rebase" or whatever >> > command wanted to place files and the index into some state by using >> > "git checkout" command, and if the post-checkout hook mucked with >> > the state in such a way that contradicts with what the "git rebase" >> > command wanted them to be in, it is not surprising the hook's behavior >> > broke "git rebase"'s operation. >> >> Having said all that, I actually think that "rebase" shouldn't be >> invoking "git checkout" (and its equivalent) internally when >> switching to a specific version, in such a way that it would trigger >> any end-user specified hooks and allow them to muck with the working >> tree and the index state. >> >> I haven't checked the actual implementation of "git rebase" for >> quite some time to be sure, but we have lower-level plumbing >> commands that are not affected by the end-user hooks for exactly >> that kind of "build higher-level commands by synthesis of >> lower-level machinery", and it is very possible that what we are >> looking at is actually a bug that needs to be fixed. I dunno. >> >> Thanks. > > Yes, and I think we should also make rebase stop invoking "git commit" too. Note that I didn't say we should make it stop invoking "git checkout". We could invent a mechanism that disables all the hook invocations and other customizations [*1*] (done e.g. via the configuration variables) for internal use of the Porcelain commands, and use it when "rebase" invokes Porcelains like "checkout", "commit" as its implementation detail, for example (some "invocations" I think bypass the run_command() inteface and instead done by directly calling the implementation detail of "checkout" and "commit", but the principles are the same). [Footnote] *1* of course, it becomes a balancing act to decide what kind of customizations are OK to honor under such a mode.