我刚刚开始研究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上。
答案 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)
Git钩子在Windows上的Git钩子工作。
请注意: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
可以运行而无需修改。
git init
初始化git存储库cd .git\hooks
导航到git hooks目录此目录包含所有git hook脚本。创建一个名为pre-commit
的文件
文件名很重要
使用以下shell脚本替换内容
#!/bin/sh
echo "Hello, World!"
test.txt
创建一个名为echo "something" > text.txt
的文件git add test.txt
暂存要提交的文件git commit -m "test commit"
观看预提交挂钩激活git commit -m "test commit"
Hello, World!
[master f00ccea] test commit
使用非常高级的Shell脚本在git挂钩中执行操作时,Windows Shell解释并不总是会叠加。例如,当将Husky git hook插件用于NPM以及更漂亮的格式化程序时,这些命令不会映射1-1。这意味着您的预提交git挂钩将在Windows上失败。
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' 的文件肯定有问题(编码或结束行符号仍不清楚)。