Git pre-commit hook无法在Windows

时间:2015-12-14 09:39:38

标签: python git pre-commit-hook shebang

我有一个git pre-commit钩子,但是在提交到本地repo之后,脚本没有被调用。这是它的外观,它在python中,钩子文件的名称被称为pre-commit,没有任何扩展名:

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

import sys, os

sys.exit(1)

1 个答案:

答案 0 :(得分:2)

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

shebang线是否正确?

shebang行应该是用于运行脚本的可执行文件的完整路径。请参阅this以了解使用(或未使用)shebang线的时间。在预提交钩子的情况下,只有在脚本上设置可执行位时才会使用shebang行。

处理shebang线的空间

如果解释器的完整路径中有空格,则引用整个路径,如下所示:

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

或者,像这样逃避路径中的空间:

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

在Windows上使用带有msysgit

的python脚本 据报道,msysgit在解释shebang线时遇到了问题。以下是一种解决方法。将python precommit-hook(示例precommit.py)重命名为其他内容,并使用以下作为precommit-hook:

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

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

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

如果未设置为可执行,则不会执行预提交挂钩。我在本地进行了测试,以下输出证明:

$ 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

  

要启用挂钩脚本,请将文件放在您的挂钩子目录中   适当命名的.git目录(没有任何扩展名)   且可执行