我想让钩子做一些事情,比如在合并分支之后运行NPM install,但只有在修改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)任何人都可以帮助我做这个。
发布于 2021-11-19 06:12:54
你写道:
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选项(“出错时退出”)。如果它做到了这一点,你就不需要后续测试了。但是这里还有一个错误:
echo "test - $?"
if [ "$?" != 0 ]; then
npm install
fi您需要删除echo命令,因为echo本身就是一个命令,因此,它会设置$?最后一个命令退出状态变量。因此,如果echo成功-它几乎总是成功的-它会将$?设置为零。
如果像看起来那样设置了-e,那么如果$?不是零,我们就不会得到这样的结果。由于设置了-e,因此不要让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 set,该测试也可以工作。
您可以通过编写以下代码来简化这一过程,因为您在then部分中没有什么可做的:
if ! git diff HEAD^ HEAD --exit-code -- ./package.json; then
npm install
fi一旦你这样做了,你可以通过编写以下代码来简化这一步:
git diff HEAD^ HEAD --exit-code -- ./package.json || npm install但主要要做的事情是:
将$;
git diff命令删除到if测试中。这些都是必需的;其他的都是可选的。
https://stackoverflow.com/questions/70030353
复制相似问题