0

我想让钩子在合并分支后执行类似运行 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

我可以git diff HEAD^ HEAD --exit-code -- ./package.json从 bash 运行,并且echo $?当有变化时显示 1,package.json否则返回 0。

但是,当我将该命令包含在合并后文件中并触发合并后事件时,它会向我显示:

diff: unknown option -- exit-code
diff: Try 'diff --help' for more information.
husky - post-merge hook exited with code 2 (error)

任何人都可以帮我解决这个问题。

4

1 回答 1

0

你写了:

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我们就不会走这么远。由于已设置,重要的是不要让命令导致脚本提前退出。要解决此问题,请将整个序列替换为:$?-egit 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

但主要要做的是:

  1. 删除$;
  2. git diff命令移动if测试中。

这些是必需的;其他一切都是可选的。

于 2021-11-19T06:12:54.267 回答