Git GUI 忽略 commit-msg 钩子

Git GUIs ignore commit-msg hook

我编写了一个 commit-msg 挂钩来检查提交消息以使用正确的格式。 使用 git bash 时,它按预期工作:

$ git commit -m "test"

[Invalid Commit Message]
------------------------
Commit message needs to start with an uppercase character and be imperative

Example: Add new character model
Regex: ^[A-Z](?!\w*ed).*$
Actual commit message: "test"
Actual length: 5

当使用 Git GUI(使用 Tortoise Git 和 GitHub for Desktop 进行测试)时,尽管它接受完全相同的提交消息。好像直接忽略了钩子。

Git GUI 不执行这个钩子吗?

更新:我发现这个钩子正在被乌龟执行git它只是因为使用的字符集而出错:“”grep:- P 仅支持单字节和 UTF-8 语言环境

我可以用“LC_ALL=en_US.utf8”解决这个问题(参见

Tortoise Git 现在阻止损坏的提交消息,但 Github Desktop 似乎仍然忽略了这个钩子。 与 Tortoise 不同,虽然我看不到它在内部做什么。

LC_ALL=en_US.utf8 是正确的解决方案。

它必须与 grep 命令在同一行中。 我尝试将它设置在文件的顶部,它以某种方式适用于 Tortoise 但不适用于 GitHub Desktop。

这是解决方案:

if [[ $(LC_ALL=en_US.utf8 grep -Pc '^[A-Z].*$' <<< ${title} ) == 0 ]];

GitHub 仅当脚本明确输出非 0 的退出代码时,桌面才会输出 stderr 输出。当脚本失败时,它不会输出任何错误。

TortoiseGit 有自己的钩子,请使用这些钩子。

https://tortoisegit.org/docs/tortoisegit/tgit-dug-settings.html#tgit-dug-settings-hooks

此外,在某些情况下,某些挂钩在设计上不受支持(例如,prepare-commit-msg,参见 Why does TortoiseGit run prepare-commit-msg after commit message edit?)。