* --reset-author does not reset author date when used in post-commit hook
@ 2025-03-31 20:19 Devste Devste
2025-04-01 0:43 ` brian m. carlson
0 siblings, 1 reply; 5+ messages in thread
From: Devste Devste @ 2025-03-31 20:19 UTC (permalink / raw)
To: git
device time zone is not UTC0
post-commit hook:
if [[ -n "${SKIP_POST_COMMIT+x}" ]] && [[ "$SKIP_POST_COMMIT" -eq 1 ]]
then
exit
fi
TZ=UTC0 SKIP_POST_COMMIT=1 git commit --amend --reset-author --no-edit
--no-verify --no-post-rewrite --allow-empty --quiet
---
Run:
git commit -m "foo"
git show -s --format="Commit: %h%nAuthor: %an%nAuthor Date:
%ad%nCommitter: %cn%nCommitter Date: %cd%nMessage: %s%n" HEAD
Expected that both Author Date: and Committer Date: show +0000 as
timezone. Only committer date shows +0000, while author date shows
time zone of device.
When manually running the post-commit code (TZ=UTC0 SKIP_POST_COMMIT=1
...) it correctly resets the author date to +0000 too
When manually setting the date using --date="$(date +%s) +0000"
instead of --reset-author it also works correctly in post-commit
hook.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: --reset-author does not reset author date when used in post-commit hook
2025-03-31 20:19 --reset-author does not reset author date when used in post-commit hook Devste Devste
@ 2025-04-01 0:43 ` brian m. carlson
2025-04-01 3:44 ` Devste Devste
0 siblings, 1 reply; 5+ messages in thread
From: brian m. carlson @ 2025-04-01 0:43 UTC (permalink / raw)
To: Devste Devste; +Cc: git
[-- Attachment #1: Type: text/plain, Size: 2215 bytes --]
On 2025-03-31 at 20:19:30, Devste Devste wrote:
> device time zone is not UTC0
>
> post-commit hook:
> if [[ -n "${SKIP_POST_COMMIT+x}" ]] && [[ "$SKIP_POST_COMMIT" -eq 1 ]]
> then
> exit
> fi
>
> TZ=UTC0 SKIP_POST_COMMIT=1 git commit --amend --reset-author --no-edit
> --no-verify --no-post-rewrite --allow-empty --quiet
>
> ---
>
> Run:
> git commit -m "foo"
> git show -s --format="Commit: %h%nAuthor: %an%nAuthor Date:
> %ad%nCommitter: %cn%nCommitter Date: %cd%nMessage: %s%n" HEAD
>
> Expected that both Author Date: and Committer Date: show +0000 as
> timezone. Only committer date shows +0000, while author date shows
> time zone of device.
>
> When manually running the post-commit code (TZ=UTC0 SKIP_POST_COMMIT=1
> ...) it correctly resets the author date to +0000 too
>
> When manually setting the date using --date="$(date +%s) +0000"
> instead of --reset-author it also works correctly in post-commit
> hook.
I can reproduce this, except that I had to use `TZ=America/Toronto`
since my system is in UTC. A quick look at the code led me to a guess
that ended up correct.
The `git commit` code sets `GIT_AUTHOR_NAME`, `GIT_AUTHOR_EMAIL`, and
`GIT_AUTHOR_DATE`. The latter contains a timezone identifier. As a
consequence, when the hook is invoked, those values are set in the
environment, and the subsequent `git commit` in the hook uses them. You
can see this by placing something like `env >/tmp/foo` in your hook and
then reading the output.
I will say that this is definitely not the intended use of the
post-commit hook and I am very much not surprised that this doesn't work
as you intended. You could certainly fix it by unsetting those
environment variables, but I'd encourage you to adopt a different
approach, such as by using an alias that sets `TZ=UTC0` to commit. That
will be more likely to work in the future and will definitely be less
brittle.
For instance, your call to `git commit` will still invoke the
`prepare-commit-msg` (and possibly `commit-msg`) hook, which might
result in unexpected changes to your message or even a failure of the
second commit.
--
brian m. carlson (they/them)
Toronto, Ontario, CA
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 263 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: --reset-author does not reset author date when used in post-commit hook
2025-04-01 0:43 ` brian m. carlson
@ 2025-04-01 3:44 ` Devste Devste
2025-04-01 22:58 ` brian m. carlson
0 siblings, 1 reply; 5+ messages in thread
From: Devste Devste @ 2025-04-01 3:44 UTC (permalink / raw)
To: brian m. carlson, Devste Devste, git
>your call to `git commit` will still invoke the
`prepare-commit-msg` (and possibly `commit-msg`) hook
Since I used --no-edit --no-verify in the example/hook, that shouldn't
be the case though?
>such as by using an alias that sets `TZ=UTC0` to commit.
Unfortunately, (at least on Windows) most tools and IDEs don't even
load a bashrc file (e.g. intellij) for their git UI, so that's not an
option (and setting the TZ as a global environment variable has
unwanted side effects, since it will set the timezone in various
applications randomly, e.g. Electron/Slack will use the TZ for some
but not for other things,...)
On Tue, 1 Apr 2025 at 02:43, brian m. carlson
<sandals@crustytoothpaste.net> wrote:
>
> On 2025-03-31 at 20:19:30, Devste Devste wrote:
> > device time zone is not UTC0
> >
> > post-commit hook:
> > if [[ -n "${SKIP_POST_COMMIT+x}" ]] && [[ "$SKIP_POST_COMMIT" -eq 1 ]]
> > then
> > exit
> > fi
> >
> > TZ=UTC0 SKIP_POST_COMMIT=1 git commit --amend --reset-author --no-edit
> > --no-verify --no-post-rewrite --allow-empty --quiet
> >
> > ---
> >
> > Run:
> > git commit -m "foo"
> > git show -s --format="Commit: %h%nAuthor: %an%nAuthor Date:
> > %ad%nCommitter: %cn%nCommitter Date: %cd%nMessage: %s%n" HEAD
> >
> > Expected that both Author Date: and Committer Date: show +0000 as
> > timezone. Only committer date shows +0000, while author date shows
> > time zone of device.
> >
> > When manually running the post-commit code (TZ=UTC0 SKIP_POST_COMMIT=1
> > ...) it correctly resets the author date to +0000 too
> >
> > When manually setting the date using --date="$(date +%s) +0000"
> > instead of --reset-author it also works correctly in post-commit
> > hook.
>
> I can reproduce this, except that I had to use `TZ=America/Toronto`
> since my system is in UTC. A quick look at the code led me to a guess
> that ended up correct.
>
> The `git commit` code sets `GIT_AUTHOR_NAME`, `GIT_AUTHOR_EMAIL`, and
> `GIT_AUTHOR_DATE`. The latter contains a timezone identifier. As a
> consequence, when the hook is invoked, those values are set in the
> environment, and the subsequent `git commit` in the hook uses them. You
> can see this by placing something like `env >/tmp/foo` in your hook and
> then reading the output.
>
> I will say that this is definitely not the intended use of the
> post-commit hook and I am very much not surprised that this doesn't work
> as you intended. You could certainly fix it by unsetting those
> environment variables, but I'd encourage you to adopt a different
> approach, such as by using an alias that sets `TZ=UTC0` to commit. That
> will be more likely to work in the future and will definitely be less
> brittle.
>
> For instance, your call to `git commit` will still invoke the
> `prepare-commit-msg` (and possibly `commit-msg`) hook, which might
> result in unexpected changes to your message or even a failure of the
> second commit.
> --
> brian m. carlson (they/them)
> Toronto, Ontario, CA
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: --reset-author does not reset author date when used in post-commit hook
2025-04-01 3:44 ` Devste Devste
@ 2025-04-01 22:58 ` brian m. carlson
2025-04-02 10:06 ` Devste Devste
0 siblings, 1 reply; 5+ messages in thread
From: brian m. carlson @ 2025-04-01 22:58 UTC (permalink / raw)
To: Devste Devste; +Cc: git
[-- Attachment #1: Type: text/plain, Size: 1702 bytes --]
On 2025-04-01 at 03:44:17, Devste Devste wrote:
> >your call to `git commit` will still invoke the
> `prepare-commit-msg` (and possibly `commit-msg`) hook
>
> Since I used --no-edit --no-verify in the example/hook, that shouldn't
> be the case though?
My testing demonstrates that `commit-msg` is skipped with `--no-edit
--no-verify`, but not `prepare-commit-msg`.
> >such as by using an alias that sets `TZ=UTC0` to commit.
>
> Unfortunately, (at least on Windows) most tools and IDEs don't even
> load a bashrc file (e.g. intellij) for their git UI, so that's not an
> option (and setting the TZ as a global environment variable has
> unwanted side effects, since it will set the timezone in various
> applications randomly, e.g. Electron/Slack will use the TZ for some
> but not for other things,...)
What I could recommend instead is setting a shell script or PowerShell
file or such as the default Git binary (instead of git.exe) and setting
`TZ=UTC0` in that script (possibly only if the command is `commit` or
`commit-tree`). I use Neovim with the fugitive extension, and
it provides functionality to override the Git executable, so I suspect
other editors will as well. This is something that will likely be
robust and unlikely to break.
The reason I make that recommendation is that I suspect you're going to
find that there are other infelicities or weird edge cases in what
you're doing and this would be a use case that I could see getting
broken accidentally. We've accidentally broken people doing `git add`
in `pre-commit` hooks (which we also don't recommend) in the past, for
instance.
--
brian m. carlson (they/them)
Toronto, Ontario, CA
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 263 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: --reset-author does not reset author date when used in post-commit hook
2025-04-01 22:58 ` brian m. carlson
@ 2025-04-02 10:06 ` Devste Devste
0 siblings, 0 replies; 5+ messages in thread
From: Devste Devste @ 2025-04-02 10:06 UTC (permalink / raw)
To: brian m. carlson, Devste Devste, git
>My testing demonstrates that `commit-msg` is skipped with `--no-edit
--no-verify`, but not `prepare-commit-msg`.
Looks like a separate bug though?
https://git-scm.com/docs/git-commit#Documentation/git-commit.txt-code--no-editcode
says:
>Use the selected commit message without launching an editor. For example, git commit --amend --no-edit amends a commit without changing its commit message.
Why would the prepare-commit-msg hook be called then?
>What I could recommend instead is setting a shell script or PowerShell
file or such as the default Git binary (instead of git.exe) and setting
`TZ=UTC0` in that script (possibly only if the command is `commit` or
`commit-tree`).
The IDEs only work with git.exe. If it's not there, it won't run at
all. The only thing possible is setting TZ= as a user environment
variable however that will obviously be picked up by other
applications and cause the weirdest side-effects (e.g. Slack/Electron
suddenly start using that time zone for some things but the
in-built/setting timezone for others and lots of other inconsistency
issues in tons of applications)
There's various tickets for various IDEs for this use case, not just
for git, but also for npm and various other tools (e.g. people need to
change the JAVA version for a tool or whatever)
Some time ago I opened "Config timezone to prevent chaos when
DST/changing timezone" in the git mailing list and I saw you also
replied. But if git had a way to actually set the timezone, these
workarounds wouldn't be necessary; alas that's another issue
On Wed, 2 Apr 2025 at 00:58, brian m. carlson
<sandals@crustytoothpaste.net> wrote:
>
> On 2025-04-01 at 03:44:17, Devste Devste wrote:
> > >your call to `git commit` will still invoke the
> > `prepare-commit-msg` (and possibly `commit-msg`) hook
> >
> > Since I used --no-edit --no-verify in the example/hook, that shouldn't
> > be the case though?
>
> My testing demonstrates that `commit-msg` is skipped with `--no-edit
> --no-verify`, but not `prepare-commit-msg`.
>
> > >such as by using an alias that sets `TZ=UTC0` to commit.
> >
> > Unfortunately, (at least on Windows) most tools and IDEs don't even
> > load a bashrc file (e.g. intellij) for their git UI, so that's not an
> > option (and setting the TZ as a global environment variable has
> > unwanted side effects, since it will set the timezone in various
> > applications randomly, e.g. Electron/Slack will use the TZ for some
> > but not for other things,...)
>
> What I could recommend instead is setting a shell script or PowerShell
> file or such as the default Git binary (instead of git.exe) and setting
> `TZ=UTC0` in that script (possibly only if the command is `commit` or
> `commit-tree`). I use Neovim with the fugitive extension, and
> it provides functionality to override the Git executable, so I suspect
> other editors will as well. This is something that will likely be
> robust and unlikely to break.
>
> The reason I make that recommendation is that I suspect you're going to
> find that there are other infelicities or weird edge cases in what
> you're doing and this would be a use case that I could see getting
> broken accidentally. We've accidentally broken people doing `git add`
> in `pre-commit` hooks (which we also don't recommend) in the past, for
> instance.
> --
> brian m. carlson (they/them)
> Toronto, Ontario, CA
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-04-02 10:06 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-31 20:19 --reset-author does not reset author date when used in post-commit hook Devste Devste
2025-04-01 0:43 ` brian m. carlson
2025-04-01 3:44 ` Devste Devste
2025-04-01 22:58 ` brian m. carlson
2025-04-02 10:06 ` Devste Devste
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox