Re: Interaction between pre-commit hook and git commit <pathspec>
- From
- Kristoffer Haugsbakk <kristofferhaugsbakk@fastmail.com>
- Date
- Nov 3, 2026, 20:13 UTC
- Message-ID
- <de4f4f35-500f-4d82-acfd-ca601444f2d2@app.fastmail.com>
- In-Reply-To
- <CY8PR17MB6236D16AD8CD80720FF1342DAE692@CY8PR17MB6236.namprd17.prod.outlook.com>
On Tue, Nov 3, 2026, at 20:58, Kevin Lyles wrote:
Show 33 quoted lines
> Hello, folks,
>
> The documentation for the pathspec option of the commit command claims:
> "The contents of these files are also staged for the next commit on top
> of what have been staged before."
> However, that appears to only be true if the pre-commit hook doesn't
> modify the index contents.
>
> Here's an example pre-commit script:
> #!/bin/sh
>
> git diff --staged --name-only | while read -r file
> do
> {
> git cat-file blob :"$file"
> echo '# Extra text'
> } |
> {
> echo -n "100644 blob "
> echo -n $(git hash-object -w -t blob --path "$file" --stdin)
> echo -e "\t$file"
> } |
> git update-index --index-info
> echo '# Extra text' >> "$file"
> done
>
> This always appends "# Extra text" to the end of any staged files, in
> both the index and the worktree. It serves to illustrate the issue,
> without getting into the weeds of what my pre-commit hook is doing.
> Suffice to say that my hook is (sometimes) modifying files in both the
> index (to make sure the updated contents are committed) and the
> worktree (to reduce spurious diffs when file contents are changed).
>[snip]Reading githooks documentation for pre-commit. To me it reads like the use case is validation/checking, not any mutation. This doesn't sound like a reasonable use case.