为什么 Git 在提交消息的底部打印不正确的差异?

Why does Git prints an incorrect diff at the bottom of a commit message?

我使用 pre-commit 挂钩 运行 Prettier 格式化程序来对付我的 HTML 文档:

#!/bin/sh

# Retrieving a list of the staged files
stagedFiles=$(git diff --staged --name-only)

# Format staged files automatically
echo "Formatting with Prettier..."
npx prettier --write $stagedFiles
git add $stagedFiles

在我输入 git commit 命令后和我配置的编辑器打开提交消息之前,格式成功应用。根据 commit.verbose 设置,Git 附加了一个 diff,显示要提交的内容,但是这个 diff 没有考虑 Prettier 所做的更改——它演示了我的代码的未格式化版本.如果我然后中止提交(将消息留空),我可以看到存储库中没有未暂存的更改;这意味着在执行 pre-commit 挂钩期间,所有格式修改都已正确暂存。此外,如果我在消息中写入一些文本并在不中止的情况下完成提交,生成的快照 确实 包含 diff 中丢失的所有格式。

我终于得出结论,差异在于。但是有解决办法吗?

Git for Windows版本:2.33.0

OS: Windows 10 21h1 x64

简短的回答是:pre-commit 挂钩不是为了修改要提交的文件。

您可以理解以下基本原理:您提交的内容将是您可以在运行宁git commit之前查看和测试的确切内容。

(技术原因是:git 创建树 -- 提交的内容 -- 将在 调用 pre-commit 之前使用钩)

pre-commit 挂钩应该写成只读操作,这可能会阻止提交的发生,例如:如果文件格式不正确,拒绝提交并显示消息“请运行 format.sh 提交前。

当然,您可以解决这个问题,但是,FWIW,我建议您遵循这条规则。