我希望挂钩执行一些操作,如在合并分支后运行NPM安装,但仅在修改package.json文件时执行
我不确定我做的是否正确,请在下面找到我的合并后
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
differenceCode=$git diff HEAD^ HEAD --exit-code -- ./package.json
echo "test - $?"
if [ "$?" != 0 ]; then
npm install
fi
我可以从bash运行git diff HEAD^ HEAD --exit-code -- ./package.json
,当package.json
发生变化时,echo $?
显示1,否则返回0。
然而,当我在合并后文件中包含该命令,并触发合并后事件时,它显示:
diff: unknown option -- exit-code
diff: Try 'diff --help' for more information.
husky - post-merge hook exited with code 2 (error)
任何人都可以帮我这个请。
1条答案
按热度按时间xam8gpfp1#
你写道:
(为什么要在
git
前面放一个美元符号$
?)这就是问题的直接根源。
$git
是一个未设置的变量;在sh
中,未设置的变量展开为空;因此您正在运行以下命令:而不是命令:
如果您删除了杂散的
$
标志,这个问题就会消失。您随后:
将显示您运行的命令的退出代码(如果它被执行)。它 * 不 * 被执行的事实表明该行:
必须设置了
-e
选项("exit on error")。如果设置了,就不需要后续测试了。但是这里有另一个错误:您需要 * 删除 *
echo
命令,因为echo
本身 * 就是 * 一个命令,因此,它 * 设置 *$?
last-command exit状态变量。因此,如果echo
成功(几乎总是成功),它会将$?
设置为零。如果设置了
-e
,就像它看起来的那样,如果$?
是 * not * zero,我们就不会走到这一步。因为设置了-e
,所以 * not * 允许git diff
命令导致脚本提前退出是很重要的。要解决这个问题,请将整个序列替换为:现在,即使设置了
-e
,测试也能正常工作。由于在
then
部分中没有任何操作,您可以将其简化一点,编写如下内容:一旦你这样做了,你就可以简化这一步,写下来:
但主要要做的是:
1.去除
$
;1.将
git diff
命令 * 移至 *if
测试。这些都是必须的其他一切都是可选的。