Você não deve usar o branch git ao escrever scripts. Git fornece uma interface de "encanamento" que é explicitamente projetada para uso em scripts (muitas implementações atuais e históricas de comandos normais do Git (adicionar, verificar, mesclar, etc.) usam essa mesma interface).
O comando de encanamento que você deseja é git for-each-ref :
git for-each-ref --shell \
--format='git log --oneline %(refname) ^origin/master' \
refs/heads/
Nota: Você não precisa do remotes/
prefixo no ref remoto, a menos que você tenha outros refs que causem origin/master
a correspondência de vários lugares no caminho de pesquisa de nome de ref (consulte “Um nome de ref simbólico.…” Na seção Especificando revisões de git-rev-parse (1) ). Se você está tentando evitar explictly ambigüidade, em seguida, ir com o nome ref completa: refs/remotes/origin/master
.
Você obterá uma saída como esta:
git log --oneline 'refs/heads/master' ^origin/master
git log --oneline 'refs/heads/other' ^origin/master
git log --oneline 'refs/heads/pu' ^origin/master
Você pode canalizar essa saída para sh .
Se você não gosta da ideia de gerar o código do shell, pode abrir mão de um pouco de robustez * e fazer o seguinte:
for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
git log --oneline "$branch" ^origin/master
done
* Nomes de ref devem ser protegidos da divisão de palavras do shell (consulte git-check-ref-format (1) ). Pessoalmente, eu ficaria com a versão anterior (código de shell gerado); Estou mais confiante de que nada de impróprio pode acontecer com isso.
Como você especificou o bash e ele oferece suporte a matrizes, você pode manter a segurança e ainda evitar a geração do seu loop:
branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
# …
done
Você poderia fazer algo semelhante $@
se não estiver usando um shell que suporte matrizes ( set --
para inicializar e set -- "$@" %(refname)
adicionar elementos).