Git 预提交挂钩在 windows 上不工作

Git pre-commit hook not working on windows

我有一个 git 预提交挂钩,但是在提交到本地存储库之后,脚本没有被调用。长这样子,在python里,hook文件的名字叫pre-commit,没有任何扩展名:

#!C:/Users/al/AppData/Local/Programs/Python/Python35-32 python

import sys, os

sys.exit(1)

您的预提交挂钩可能会遇到以下一个或多个问题:

shebang 行是否正确?

shebang 行应该是用于 运行 脚本的可执行文件的完整路径。请参阅 this 了解何时使用(或未使用)shebang 行。在预提交挂钩的情况下,shebang 行将仅在脚本上设置可执行位时使用。

处理 shebang 行中的 spaces

如果解释器的完整路径中有 space,要么像这样引用整个路径:

#!"C:/Users/al/AppData/Local/Programs/Python/Python35-32 python"

或者,像这样在路径中转义 space:

#! C:/Users/al/AppData/Local/Programs/Python/Python35-32\ python

在 Windows 上使用 python 脚本与 msysgit

据报道,msysgit 在解释 shebang 行时存在问题。以下是解决方法。将 python precommit-hook(例如 precommit.py)重命名为其他名称,并使用以下内容作为 precommit-hook:

#!/bin/sh
python .git/hooks/pre-commit.py $* 

预提交钩子脚本是否可执行?

(这并不严格适用于当前问题,因为OP在windows,但为了完整起见,我将在此处保留以下内容)

pre-commit hook如果没有设置为可执行则不会执行。我在本地对此进行了测试,以下输出证明:

$ cd ~/test-git 
$ cat .git/hooks/pre-commit
#!/usr/local/bin/python
import sys, os
print "yo! this is the pre-commit hook"
sys.exit(1)

$ chmod -x .git/hooks/pre-commit
$ git commit -am "Test"
[master (root-commit) 0b1edce] Test
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a

$ chmod +x .git/hooks/pre-commit
$ git commit -am "Test"
yo! this is the pre-commit hook

此外,来自 https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks

To enable a hook script, put a file in the hooks subdirectory of your .git directory that is named appropriately (without any extension) and is executable.