为什么 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,我建议您遵循这条规则。
我使用 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,我建议您遵循这条规则。