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

use*_*653 40 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
Run Code Online (Sandbox Code Playgroud)

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

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

注意:这是在Windows 7 PC上.

Ase*_*nar 49

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

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

  • 试试`chmod + x pre-commit` (58认同)
  • chmod + x对linux来说是一个好主意,但它与windows有关 (5认同)
  • 我不得不使用`#!/ bin/bash`而不是`#!/ bin/sh`来在Windows下运行它. (4认同)
  • 谢谢你的建议。刚刚尝试过,现在当我尝试提交时出现错误:“错误:无法生成 .git/hooks/pre-commit:没有这样的文件或目录”。 (2认同)

edi*_*999 36

您可能没有运行该pre-commit文件的权限

在您的终端中运行:

chmod +x .git/hooks/pre-commit
Run Code Online (Sandbox Code Playgroud)

感谢@vaughan提出这个想法

  • chmod +x? 在 Windows 上?问题是“不能在 WINDOWS 上运行”。 (4认同)

小智 19

就我而言,我设置了core.hooksPath错误的目录。

重置它git config --global core.hooksPath '~/.githooks'解决了问题:)

您可以使用以下命令验证您的钩子路径git config --get core.hooksPath


小智 11

TL; 博士

默认情况下,假设 git hook脚本很简单, Git hooks在 Git for Windows 上工作

Git和Windows的背景

请注意Git是为 shell解释而制作的;因此,在 Windows 命令提示符或 Windows 制造的 PowerShell 上使用 git hooks 将有其固有的缺陷,并且无法预期完全的互操作性

在 Windows 上使用 git hooks 是可能的,但有很多缺点。

Windows 版 Git使用一个 shell 模拟器,使 bash 和 shell 命令成为可能。这意味着当一个 git hook 被 git 激活时,windows 版本将使用 shell 模拟器运行命令。反过来,将这些 shell 命令转换为 Windows 操作系统可以理解的命令。意思是,简单的 shell 脚本可以立即运行。例如,pre-commit随 git 存储库初始化一起提供的 git hook无需修改即可运行。

默认行为示例

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

    文件名很重要

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

    #!/bin/sh
    
    echo "Hello, World!"
    
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

不良行为示例

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

回答 user1578653 问题

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

.git\钩子\预提交

git commit -m "test commit"
Hello, World!
[master f00ccea] test commit
Run Code Online (Sandbox Code Playgroud)

您会注意到 git 钩子工作并将单词输出HOOK RUNNING到控制台,并且thisCauseError将打印一条错误消息stderr并将其打印到文件中EmptyFile.txt