git Husky hook合并后检查package.json是否有任何更改,如果检测到更改,则执行npm安装

fykwrbwg  于 2023-01-11  发布在  Git
关注(0)|答案(1)|浏览(173)

我希望挂钩执行一些操作,如在合并分支后运行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)

任何人都可以帮我这个请。

xam8gpfp

xam8gpfp1#

你写道:

differenceCode=$git diff HEAD^ HEAD --exit-code -- ./package.json

(为什么要在git前面放一个美元符号$?)
这就是问题的直接根源。$git是一个未设置的变量;在sh中,未设置的变量展开为空;因此您正在运行以下命令:

diff HEAD^ HEAD --exit-code -- ./package.json

而不是命令:

git diff HEAD^ HEAD --exit-code -- ./package.json

如果您删除了杂散的$标志,这个问题就会消失。
您随后:

echo "test - $?"

将显示您运行的命令的退出代码(如果它被执行)。它 * 不 * 被执行的事实表明该行:

. "$(dirname "$0")/_/husky.sh"

必须设置了-e选项("exit on error")。如果设置了,就不需要后续测试了。但是这里有另一个错误:

echo "test - $?"

if [ "$?" != 0 ]; then 
npm install
fi

您需要 * 删除 * echo命令,因为echo本身 * 就是 * 一个命令,因此,它 * 设置 * $? last-command exit状态变量。因此,如果echo成功(几乎总是成功),它会将$?设置为零。
如果设置了-e,就像它看起来的那样,如果$?是 * not * zero,我们就不会走到这一步。因为设置了-e,所以 * not * 允许git diff命令导致脚本提前退出是很重要的。要解决这个问题,请将整个序列替换为:

if git diff HEAD^ HEAD --exit-code -- ./package.json; then
    # ... code to handle a zero exit code here
else
    # ... code to handle a nonzero exit here
fi

现在,即使设置了-e,测试也能正常工作。
由于在then部分中没有任何操作,您可以将其简化一点,编写如下内容:

if ! git diff HEAD^ HEAD --exit-code -- ./package.json; then
    npm install
fi

一旦你这样做了,你就可以简化这一步,写下来:

git diff HEAD^ HEAD --exit-code -- ./package.json || npm install

但主要要做的是:
1.去除$;
1.将git diff命令 * 移至 * if测试。
这些都是必须的其他一切都是可选的。

相关问题