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/HEADmostraref: refs/heads/masterpor convenção. O erro é lançado porqueHEADé ambíguo. Você não tem histórico, portanto, qualquer valor passado pararev-parseseria 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 $? 128Em 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á.
-
HEADnã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 ponteiroHEADestá apontando para uma confirmação. Você obtémHEADcomo o retorno usando o método (1) porquerev-parseestá 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