git不能像钩子一样执行python-script

Luk*_*uth 13 python windows git msysgit githooks

pre-commit在python中创建了一个小钩子.这个钩子在Linux下就像一个魅力,但在Windows中它一直告诉我:

error: cannot spawn .git/hooks/pre-commit: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我知道这里有类似的问题关于同一个问题和结论接缝是shebang.我的脚本在第一行有这个:

#!F:\PortableApps\PortablePython3.2\App\python.exe
Run Code Online (Sandbox Code Playgroud)

同样有趣的是,通过编写简单地执行脚本.git/hooks/pre-commit非常精彩,但是一旦我尝试提交,git就会吐出上面的消息.

另一件有趣的事情是,当我将编码从ANSI转换为UTF-8(使用Notepad ++)时,在尝试执行脚本时出现以下错误:

.git/hooks/pre-commit: Cannot execute binary file
Run Code Online (Sandbox Code Playgroud)

我正在使用以下工具:

Luk*_*uth 13

我使用代理方法使python脚本在windows下运行(使用msysgit).可以在这里找到完整的脚本(以及我如何做的描述):https://gist.github.com/1839424

这是使其在Windows下工作的重要部分


如果你正在使用Windows(和"msysgit"),它会有点复杂.由于"msysgit"似乎在处理SHEBANG时遇到问题,因此您必须使用一个小技巧来使脚本可执行(有关此问题的更多信息可以在此处找到).

为了使脚本有效,您需要从Python脚本中删除SHEBANG("pre -commit.py")并使用包装器bash脚本来调用解释器.此脚本应如下所示:

#!/bin/sh
python .git/hooks/pre-commit.py
Run Code Online (Sandbox Code Playgroud)

将此脚本存储为名为"pre-commit"的文件(无文件结尾).这假设你的PATH中有Python .如果不这样做,您还可以指定解释器可执行文件的完整路径.

这个脚本将由"git commit"调用,并调用python脚本来检查巨大的文件.SHEBANG之后的路径不应该更改,因为"msysgit"会自动重新映射它.您必须为要执行的Python脚本指定相对于repo-root的路径(因为这是调用脚本的位置).

之后你会想要将包装文件("pre-commit")和Python脚本("pre -commit.py")复制到你的repos".git/hooks"-directory,个性化Python脚本("max_file_size"和"git_binary_path")并标记"预提交"文件可执行文件.

  • 如果你想传播参数(例如,对于post-checkout钩子),附加一个`$*`:`python .git/hooks/pre-commit.py $*` (3认同)