Git预提交挂钩没有在Windows上运行

时间:2013-12-16 11:29:17

标签: windows git version-control githooks

我刚刚开始研究Git钩子,但我似乎无法让它们运行。

我设置了一个本地存储库,因此我的项目文件夹中现在有一个'.git'目录。我已将“.cmd”文件添加到名为“pre-commit.cmd”的C:/path/to/my/project/.git/hooks目录中。以下是此文件的内容:

echo "HOOK RUNNING"
echo. 2>C:/path/to/my/project/.git/hooks/EmptyFile.txt

这应该回显文本“HOOK RUNNING”并在该目录中创建一个空文本文件。但是,如果我通过我的IDE(NetBeans)提交更改或使用Git Bash提交,它们似乎都没有运行我的预提交挂钩,因为没有创建文件。

我的理解是,你需要做的就是使用钩子的名称添加一个可执行文件(正如我所做的那样)。我做错了吗?

注意:这是在Windows 7 PC上。

9 个答案:

答案 0 :(得分:42)

如何命名你的钩pre-commit(没有任何扩展名)?

编辑并在第一行添加#!/bin/sh#!/bin/bash(在评论中建议)

答案 1 :(得分:33)

您可能无权运行pre-commit文件

在您的终端中运行:

chmod +x .git/hooks/pre-commit

感谢@vaughan提出这个想法

答案 2 :(得分:2)

对我来说,以上解决方案均无效。我将预提交文件从钩子移到了其他位置,从而有效地从钩子中删除了文件。

对我有用的:D

答案 3 :(得分:1)

对我来说,我试图运行一个.bat文件。

我发现反斜杠需要转义

例如:

#!/bin/bash
C:\\somefolder\\somefile.bat

答案 4 :(得分:0)

在我的情况下我做npm install&意外删除 .git 文件夹,npm install pre-commit --save工作

答案 5 :(得分:0)

也许会帮助某人-就我而言,我将core.hooksPath设置为错误的目录。使用git config --global core.hooksPath '~/.githooks'重置它可以解决此问题:)

答案 6 :(得分:0)

TL; DR

假设git钩子脚本很简单,默认情况下

Git钩子在Windows上的Git钩子工作

Git和Windows的背景

  

请注意Git是为外壳interpretation设计的;因此,在Windows命令提示符上使用git hooks或Windows制作的PowerShell将固有地具有缺陷,并且不希望出现完整的interoperability

在Windows上可以使用git hook,但是有很多缺点。

Git for Windows使用shell模拟器,使bash和shell命令成为可能。这意味着当git激活git钩子时,Windows版本将使用Shell模拟器运行命令。依次将这些Shell命令转换为Windows操作系统可以理解的命令。意思是,简单的shell脚本将立即起作用。例如,带有git存储库初始化的git钩子pre-commit可以运行而无需修改。

默认行为示例

  1. 使用命令git init初始化git存储库
  2. 使用命令cd .git\hooks导航到git hooks目录
  3. 此目录包含所有git hook脚本。创建一个名为pre-commit的文件

      

    文件名很重要

  4. 使用以下shell脚本替换内容

    #!/bin/sh
    
    echo "Hello, World!"
    
    
  5. 导航回项目的根目录,并使用命令test.txt创建一个名为echo "something" > text.txt的文件
  6. 使用命令git add test.txt暂存要提交的文件
  7. 提交更改并使用命令git commit -m "test commit"观看预提交挂钩激活
  8. 验证输出,如下所示
    git commit -m "test commit"
    Hello, World!
    [master f00ccea] test commit
    

不良行为示例

使用非常高级的Shell脚本在git挂钩中执行操作时,Windows Shell解释并不总是会叠加。例如,当将Husky git hook插件用于NPM以及更漂亮的格式化程序时,这些命令不会映射1-1。这意味着您的预提交git挂钩将在Windows上失败。

正在回答用户1578653问题

git钩子是可执行脚本;但是,您使用的是命令提示符脚本(.cmd),而不是Shell脚本(.sh)。如果您希望在Windows操作系统上描述此行为,请创建一个名为pre-commit的文件并将其放在.git\hooks目录中(相对于您正在处理的项目)。然后将以下内容放入该文件。

.git \ hooks \ pre-commit

#!/bin/sh

echo "HOOK RUNNING"
thisCausesError 2> .git/hooks/EmptyFile.txt

您会注意到git钩子起作用并且将单词HOOK RUNNING输出到控制台,并且thisCauseError将向stderr打印一条错误消息,该错误消息将被打印到文件{ {1}}。

答案 7 :(得分:0)

如果它可以帮助任何人: 我遇到以下错误:

error: cannot spawn .git/hooks/pre-commit: No error

事实证明,在我的预提交文件中,最后一个退出命令后我没有'newline'字符:

#!/bin/sh
# From gist at https://gist.github.com/chadmaughan/5889802

# stash any unstaged changes
git stash -q --keep-index

# run the tests with the gradle wrapper
./gradlew test --daemon

# store the last exit code in a variable
RESULT=$?

# unstash the unstashed changes
git stash pop -q

# return the './gradlew test' exit code
exit $RESULT
# << must have a newline after above command >> 

我在Windows上运行gradle项目,并在cmder shell和cmd中运行gradle命令

答案 8 :(得分:0)

尝试了其他答案中建议的解决方案,但无助于解决此问题:cannot spawn .git/hooks/pre-commit: No such file or directory

对我有用的解决方案是将文件 .git/pre-commit.sample 重命名为 .git/pre-commit 并插入脚本以更漂亮地格式化已更改的文件。我手动创建的名为 'pre-commit' 的文件肯定有问题(编码或结束行符号仍不清楚)。