使git-hook调用cmd.exe,而无需等待该过程完成

时间:2019-04-23 09:59:08

标签: windows bash git cmd githooks

在Windows计算机上,我添加了一个git-hook来启动构建;这需要通过cmd.exe运行,我不希望git-hook脚本等待该脚本完成执行,因为这将意味着每次推送都需要很长时间才能完成。

要重现该问题,请在Windows上git bash的空目录中运行以下命令:

mkdir githooks && cd githooks/
git init --bare
cd ..
git clone githooks clone
cd clone
git commit --allow-empty -m "1"

并将以下内容保存到./githooks/hooks/update

#!/bin/bash
cmd.exe /c "sleep 2"
exit 1;

在git bash窗口中,从我留给您的克隆目录中,运行git push。请注意,以exit 1;结束更新脚本很方便,因为您可以在每次编辑git-hook脚本后重新运行git push。

我已经尝试了可以​​想到的“不等待被调用脚本退出”这两种方法的每一种组合;在bash中,您附加&符&:

cmd.exe /c "sleep 2" &

在cmd.exe(蝙蝠文件)中,您将start行:

cmd.exe /c "start \"title\" sleep 2"

我希望这两种方法都可以起作用-即git push应该很快就会失败,而不是等2秒钟才失败。

嵌套cmd似乎不会对此造成影响:

cmd.exe /c "cmd.exe /c \"start \"\" sleep 2\"" &

提交答案时,请确保还通过将sleep 2替换为例如,来检查赋予cmd.exe的命令是否实际执行。 mkdir ..\foo以便您可以检查,不仅在给定sleep命令时脚本可以快速完成,而且在给定mkdir命令时可以实际创建目录。

cmd.exe /c "mkdir ..\foo"

例如,以下立即完成,但这是因为sleep 2从未执行,因为/ c需要用下一个参数引起来。

cmd.exe /c start \"title\" sleep 2

1 个答案:

答案 0 :(得分:1)

我试图做同样的事情,最终有了一个想法来调用另一个 bash 脚本:

sh $(pwd)/.git/hooks/runCmd.sh >/dev/null 2>&1 &

它调用我想要的 CMD 脚本并传递参数。 bash 脚本的主体:

#!/bin/sh
start "Path\MyCmd.cmd" hook
exit 0  

在这种情况下,路径是相对于存储库根目录的。