Não responde totalmente às suas perguntas, mas provavelmente é um pouco mais do que apenas um comentário:
-
Com base em outros comentários em sua resposta, acho que o erro que você viu é
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
. Isso ocorre porque você está realizando esses testes em um novo repositório git, que não tem nenhum trabalho confirmado. Não só isto não é realmente um teste justo (seu desempenho será, por definição, pior em um repositório maior), mas em quase todos os casos é um caso extremo. Por exemplo,.git/HEAD
mostraref: refs/heads/master
por convenção. O erro é lançado porqueHEAD
é ambíguo. Você não tem histórico, portanto, qualquer valor passado pararev-parse
seria tratado da mesma forma. Além disso, isso não sai 0 para mim:$ git init /tmp/test && cd /tmp/test $ git rev-parse --abbrev-ref HEAD $ echo $? 128
Em suma, não se preocupe com esse erro. Agarre-se a um dos maiores repositórios do Android, ou talvez ao kernel do linux, e teste seu prompt lá.
-
HEAD
não é um ramo. É um ponteiro para o estado de check-out. Quando você tem um branch check-out, é uma referência simbólica a esse branch. Quando você está no estado 'HEAD desconectado', o ponteiroHEAD
está apontando para uma confirmação. Você obtémHEAD
como o retorno usando o método (1) porquerev-parse
está apenas ecoando o valor de refspec passado no erro. Experimente comblah
; você verá a mesma coisa. -
Na verdade, eu não testei soluções, mas algumas coisas que você pode tentar (ambas são usadas no meu prompt zsh, que eu não escrevi, e as duas tiveram um bom desempenho):
git rev-parse --is-inside-work-tree ;# avoids your 'test -d .git' call ref=$(git symbolic-ref HEAD 2> /dev/null) ;# grab the full refspec branch=$(echo ${ref#refs/heads/}) ;# extract the branch name