msysgit钩子错误:“git错误:无法生成.git/hooks/post-commit:没有这样的文件或目录”

57
我在尝试使用msysgit(Windows 7 Pro/32和Ultimate/64)来正确运行post-recieve和post-commit钩子时遇到了问题。 如果我从git-bash或控制台提交,对于post-commit钩子,我会得到上面的错误,但如果通过git-gui提交,则可以正常工作。 对于post-recieve钩子,所有三个都给出相同的错误。 我认为这是某种权限或路径错误,但我真的不知道从哪里开始。
9个回答

110

在钩子的第一行添加 SHEBANG,像这样:

#!/bin/sh
echo "executing post-commit"
exit 0

这个问题曾经让我也束手无策,后来发现添加 shebang 就解决了。在 SVN 的世界里,*nix 中有一个“pre-commit”脚本,在 Windows 中有“pre-commit.bat”,SVN 在 Windows 中会自动选择 bat 文件。然而,Git 似乎不会选择 pre-commit.bat(或任何钩子),添加 shebang 到钩子文件中能够解决问题。


3
他的意思是指第一行。我不小心在顶部留了一个空白行,导致出现了相同的错误。 - jeef3
仅供参考-挂载文件也必须是ASCII编码,我有一个工具生成的Unicode格式的挂载文件,由于在感叹号前面有一些格式化字节,因此也出现了相同的错误。 - mamidon
另外提醒一下:在我的系统上,我有一个带有perl shebang的钩子。但是perl.exe不在路径中。将其添加到环境变量后,错误消失了。 - Fildor

11

我正在使用SourceTree和git LFS,并遇到了类似的问题:无法生成.git/hooks/pre-push

解决方法是删除pre-push文件(打开它后发现它已经损坏),然后重新启动SourceTree,此时它会重新生成pre-push文件,一切回归正常。


非常感谢。我遇到了一次停电,对我来说是post-checkout文件损坏了。 - Mark

6
如果你有添加了 SHEBANG(也称为 hashbang)但仍然失败了,那么请确保将<path_to_git>\bin 添加到你的路径环境变量中。
如果你想要在命令行中使用它,则还需要将<path_to_git>\cmd 添加到你的路径环境变量中。

3

在使用LFS的存储库中遇到了这个问题,通过git lfs update --force命令解决了它。


3
这是一个老问题,但我一直在解决这个确切的问题,而这个SO问题出现了,所以我认为值得记录一下我做的事情。
简而言之:我需要将Apache作为普通用户而不是Local System运行。这是在我正在测试的遗留测试VM上,所以它只运行Windows XP,但似乎至少在该平台上(可能还有其他平台),当在Local System帐户下运行时,msysgit无法正常工作(可能是根文件系统未正确映射)。因此,没有任何shebang行能够工作,因为git-http-backend根本无法执行任何msysgit二进制文件(即使使用绝对的Windows路径)。
将Apache切换为运行为普通用户帐户完全解决了这个问题。显然,您需要确保Apache正在运行的用户帐户具有读/写git存储库的权限,但除此之外,只需确保您的shebang行是#!/bin/sh,一切都应该很好。
最后,是的,这是一个大锤子。理想情况下,您可以在Windows上使用像suexec这样的东西,但快速搜索并没有指出明显的前进道路。当然,如果有人有任何想法,我会感兴趣。
目前,这对我来说有效,但似乎并不理想。

我相信问题确实是将<path_to_git>\bin添加到您的路径中。我使用了一个普通用户帐户,得到了相同的错误。一旦我在路径中有了bin,我就可以作为普通用户帐户或本地系统运行而没有任何问题。在您的情况下,您可能只在常规用户帐户中设置了路径。 - Kenneth Xu
我很好奇Apache在这一切中的作用。它不是我的工作流程的一部分,但除此之外,所有症状都匹配。Git在我的全局环境路径中(C:\Program Files (x86)\Git\bin..\cmd)。我是否有什么误解? - Barney

2
如果有人(比如我)在通过Apache访问git存储库时遇到类似的问题,应该在Apache配置中设置路径,例如:
SetEnv PATH "c:/Program Files (x86)/Git/bin;"

感谢@Xmister。我们将其添加到httpd.conf中,这似乎解决了问题。 - tjg184

1
使用TortoiseGit和LFS,我只需要删除.git/hooks文件夹中的文件。

1
如果您正在使用Android Studio,您可以通过取消选中“运行Git钩子”复选框来解决此错误:

Un-check the checkbox "Run Git hooks", this will solve your problem


0

对我来说,在 shebang 行前面删除注释行解决了错误。奇怪的是,脚本在 shell 中运行得很好,但作为钩子运行时出错。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接