2012-02-16 128 views
10

我在python中创建了一个小的pre-commit钩子。这个钩子就像Linux下的一个魅力,但在Windows中,它不断告诉我:git无法执行python脚本作为钩子

error: cannot spawn .git/hooks/pre-commit: No such file or directory 

我知道有一直在这里类似的问题同一个问题,结论接缝是家当。我的脚本有此上的第一行:

#!F:\PortableApps\PortablePython3.2\App\python.exe 

这也是有趣的是,仅仅通过写.git/hooks/pre-commit执行脚本作品精彩,但只要我尝试提交,git的吐出上述消息。

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

.git/hooks/pre-commit: Cannot execute binary file 

我使用以下工具:

+0

可能的重复[我怎么能得到我的git(windows上的msysgit)post-commit脚本来调用我的python脚本而不是bash?](http:// stackoverflow。com/questions/1547005 @ how-can-i-get-my-git-msysgit-on-windows-post-commit-script-to-invoke-my-python) – Amber 2012-02-16 09:02:25

+0

@Amber使用bash脚本作为包装器调用'python.exe pre-commit.py'工作。但是,有没有Python版本? – 2012-02-16 09:15:45

回答

10

我使用代理方法使python脚本在windows下工作(使用msysgit)。完整的脚本(与我是如何做到的说明)可能在这里找到:https://gist.github.com/1839424

这里是关于使它的Windows


下工作,如果你正在使用Windows系统的重要组成部分(与“ msysgit“),这有点复杂。由于“msysgit”似乎在处理SHEBANG时遇到问题,因此您必须使用一些小技巧才能使脚本可执行(有关此问题的更多信息,请参阅here)。

为了使脚本正常工作,您需要从Python脚本中移除SHEBANG(“pre-commit.py”)并使用包装器bash脚本来调用解释器。该脚本应该如下所示:

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

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

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

之后,您需要将wrapper-file(“pre-commit”)和Python-script(“precommit.py”)复制到您的repos“.git/hooks”目录中,个性化Python脚本(“max_file_size”和“git_binary_path”)并标记“预提交”文件可执行文件。

+3

如果你想传播参数(例如post-checkout钩子),附加一个'$ *':'python .git/hooks/precommit.py $ *' – Onur 2012-10-18 12:07:03

+0

Python脚本本身不一定要在里面.git目录。如果您愿意,它可以位于您的存储库中的其他位置,以便将其作为存储库的一部分提交。 然后,通过以编程方式创建这里描述的.git/hooks文件夹中的shell脚本,也可以非常简单地将git钩子安装到repo的新克隆中。 – bsa 2013-10-15 09:35:23

+0

如果团队成员有不同的操作系统会怎么样。例如,我们有一个Android存储库,开发人员在OS X和Windows上都可以使用它。我们如何确保我们的钩子能够跨越不同的操作系统? – 2016-06-27 05:54:24