问题描述
我写了一个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桌面版的Testet)时,尽管它接受完全相同的提交消息。似乎只是忽略了钩子。
Git GUI是否不执行此钩子?
更新:我发现该钩子正在由git乌龟执行,由于使用了字符集,它只是出现了一个错误:“” grep:-P仅支持单字节和UTF-8语言环境
我可以使用“ LC_ALL = en_US.utf8”解决此问题(请参见here)
Tortoise Git现在可以阻止损坏的提交消息,但是Github Desktop似乎仍然忽略了该钩子。 与Tortoise不同,尽管我看不到它在内部做什么。
解决方法
LC_ALL = zh_CN.utf8是正确的解决方案。
它只需与grep命令在同一行中即可。 我尝试将其设置在文件的顶部,该文件以某种方式适用于Tortoise,但不适用于GitHub Desktop。
这是解决方案:
if [[ $(LC_ALL=en_US.utf8 grep -Pc '^[A-Z].*$' <<< ${title} ) == 0 ]];
仅当脚本显式输出非0的退出代码时,GitHub桌面才会输出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?)。