Re: [Bug] commit cleanup does not happen during autosquash rebase
- From
- Simon Cheng <cyqsimon@gmail.com>
- Date
- Sep 15, 2025, 09:03 UTC
- Message-ID
- <CA+itcS2Knde3K_JuVru6_s=Eh0rPBPi1aa1=y0_wyA-=A7CXsQ@mail.gmail.com>
- In-Reply-To
- <63e7901f-4210-438e-9389-8117d5fb83b6@gmail.com>
Resending because I accidentally used HTML mode.
Thanks Phillip,
Sorry for replying so late. I forgot to set up notifications for this email address, so I had basically completely forgotten about this matter.
Yes I fully agree with your proposed approach. Also it's probably a good idea to update the `git-config(1)` man page to document all the commands affected by `commit.cleanup`.
Cheers,
Simon
On Mon, 18 Aug 2025 at 23:14, Phillip Wood <phillip.wood123@gmail.com> wrote:
Show 100 quoted lines
>
> Hi Simon
>
> On 13/08/2025 12:39, Simon Cheng wrote:
> >
> > What did you do before the bug happened? (Steps to reproduce your issue)
> >
> > 1. Initialize a git repo with `git init`
> > 2. Install a custom `prepare-commit-msg` hook that injects some comments
> > - Intention: inject the output of `git log --oneline -n10` during
> > interactive commit, so I can see past commits
> > 3. Run `git config commit.cleanup strip`
> > - Intention: strip the injected comments too in non-interactive mode
> > (e.g. `git cherry-pick` & `git rebase`)
> > 4. Run `touch foo && git add -A && git commit -m "Initial commit"`
> > 5. Run `touch bar && git add -A && git commit --fixup=@`
> > 6. Run `git rebase --root --autosquash`
>
> Thanks for providing a simple way to reproduce this
>
> > What did you expect to happen? (Expected behavior)
> >
> > Git would perform the autosquash, while keeping the commit message of
> > the squash target unchanged.
> >
> > What happened instead? (Actual behavior)
> >
> > Git performed the autosquash, but the commit message of the squash
> > target is now clobbered with my injected comments.
>
> It looks like this stems from f7d42ceec52 (rebase -i: do leave commit
> message intact in fixup! chains, 2021-01-28) which was added in response
> to a bug report[1]. That commit switched from always cleaning up the
> fixup message to never cleaning it up. I wonder if instead we should be
> respecting the user's commit.cleanup setting. The commit message says
> that should not respect commit.cleanup because we want to use the
> message verbatim but that is not what we do with "pick" commands which
> respect commit.cleanup if it is set. Given that we call the
> prepare-commit-msg hook we cannot be sure that we're reusing the
> original commit message verbatim anyway so I think we should probably
> change "fixup" commands to use the same cleanup flags as "pick" commands.
>
> I'm going to be off the list for a week from tomorrow but I'll try and
> look at this again when I'm back if no one else has picked it up in the
> meantime.
>
> Thanks
>
> Phillip
>
> [1]
> https://lore.kernel.org/git/CANVGpwZGbzYLMeMze64e_OU9p3bjyEgzC5thmNBr6LttBt+YGw@mail.gmail.com/
>
> > What's different between what you expected and what actually happened?
> >
> > I expected commit cleanup to happen during the autosquash. It seems
> > like that didn't happen.
> >
> > Anything else you want to add:
> >
> > Here is my `prepare-commit-msg` script. But I expect this issue to be
> > replicable with anything that injects comments.
> >
> > ```
> > #!/usr/bin/env bash
> > {
> > echo '# Last 10 commits:'
> > git log --oneline -n 10 --decorate=short | sed 's/^/# /'
> > echo '#'
> > } >> "$1"
> > ```
> >
> > Please review the rest of the bug report below.
> > You can delete any lines you don't wish to share.
> >
> >
> > [System Info]
> > git version:
> > git version 2.50.1
> > cpu: x86_64
> > built from commit: d82adb61ba2fd11d8f2587fca1b6bd7925ce4044
> > sizeof-long: 8
> > sizeof-size_t: 8
> > shell-path: /bin/sh
> > libcurl: 8.14.1
> > OpenSSL: OpenSSL 3.5.1 1 Jul 2025
> > zlib-ng: 2.2.4
> > SHA-1: SHA1_DC
> > SHA-256: SHA256_BLK
> > uname: Linux 6.12.41-1-lts #1 SMP PREEMPT_DYNAMIC Fri, 01 Aug 2025
> > 20:42:03 +0000 x86_64
> > compiler info: gnuc: 15.1
> > libc info: glibc: 2.42
> > $SHELL (typically, interactive shell): /bin/bash
> >
> >
> > [Enabled Hooks]
> > prepare-commit-msg
> >
>