为什么在 .sh 中使用带有 && 的 git 会失败,但在命令行中却不会失败?

为什么在 .sh 中使用带有 && 的 git 会失败,但在命令行中却不会失败?

我有一个脚本(名为update_content.sh),它应该运行 3 个连续的git命令,第一个版本如下所示:

#!/bin/sh
git fetch --all && git reset --hard && git merge

当我运行它时,我看到以下输出:

web@bane:~# ./update_content.sh
Fetching origin
error: unable to create file locales/fr.json (File exists)
error: unable to create file locales/it.json (File exists)
fatal: Could not reset index file to revision 'HEAD'.

但是当我将其改为这样时:

#!/bin/sh
git fetch --all
git reset --hard
git merge

运行它,我看到的是:

web@bane:~# ./update_content.sh
Fetching origin
HEAD is now at 5859b2e Added Business tab
Already up-to-date.

换行方法可以得到我想要的结果,但它不具备 的“如果步骤失败则不继续”的特性&&。 工作原理中是否存在git与 不兼容的地方&&,或者我遗漏了 的某些内容&&

我做了更多的挖掘,发现&&从命令行运行的单行程序不会引发错误,但实际上也不会重置本地工作副本,但是脚本内部的新行方法(一次运行一个)会。

答案1

您也可以创建一个别名来链接所有命令,然后执行别名对象本身。

git config alias.op '!git fetch --all && git reset --hard && git merge'
git op

&&仅当第一个命令以状态 0 退出(成功)时才运行第二个命令。;运行两个命令,即使第一个命令以非零状态退出。

你的例子&&可以等效地解释为

if git fetch --all ; then
    if git reset --hard; then
       git merge
    fi
fi

相关内容