Por que usar git com && falha quando dentro de um .sh, mas não na linha de comando?

0

Eu tenho um script (chamado update_content.sh ) que deve executar 3 comandos git consecutivos e a primeira versão ficou assim:

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

Quando eu executo, vejo esta saída:

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'.

No entanto, quando eu mudei para isso:

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

E corra, vejo isso:

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

A abordagem de nova linha obtém o resultado que eu quero, mas não tem a qualidade "não prossiga se uma etapa falhou" do && . Existe algo sobre como git funciona que o torna incompatível com o && ou estou faltando algo sobre && ?

Eu fiz um pouco mais de escavação e descobri que o one liner com && quando executado a partir da linha de comando não gera erros, mas também não redefine a cópia de trabalho local, mas a nova abordagem dentro de um script (e execute um de cada vez) faz.

    
por Jason Sperske 09.08.2017 / 20:16

1 resposta

1

Normalmente eu acho que um dos dois primeiros comandos sai com um código diferente de zero. Mas isso impediria que todos os comandos a seguir fossem executados, e comandos não executados não poderiam gerar mensagens de erro ...

No entanto, você pode verificar o código de saída dos comandos com isto:

git fetch --all   ; echo "exit code: ${?}"
git reset --hard  ; echo "exit code: ${?}"
git merge         ; echo "exit code: ${?}"

E ajudaria a executar o script por meio de

bash -vx ./update_content.sh
    
por 09.08.2017 / 20:30