Почему использует мерзавца со сбоем && когда в .sh, но не из командной строки?

У меня есть сценарий (названный 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 работы, который делает это несовместимым с && или я пропускаю что-то о &&?

Я сделал немного больше рытья и нашел что один лайнер с && когда выполнено из командной строки не бросает ошибки, но также и на самом деле не сбрасывает локальную рабочую копию, однако подход новой строки в сценарии (и выполнять по одному) делает.

2
задан 9 August 2017 в 20:57

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
3
ответ дан 2 December 2019 в 02:46

Другие вопросы по тегам:

Похожие вопросы: