O que o git rev-parse faz?

282

O que git rev-parsefaz?

Eu li a página de manual, mas levantou mais perguntas do que respostas. Coisas como:

Parâmetros de separação e massagem

Massagem ? O que isso significa?

Estou usando como um resolvedor (para SHA1) de especificadores de revisão, como

git rev-parse HEAD^

ou

git rev-parse origin/master

Esse é o objetivo do comando? Se não, é correto usá-lo para conseguir isso?

talles
fonte
3
Tanto quanto posso ver na página de manual, é um utilitário principalmente interno para analisar nomes de revisão / objeto para outros comandos. O que você está fazendo é praticamente o objetivo do rev-parsecomando. Você também pode usá-lo para normalizar uma linha de comando, para que o programa real não precise entender a sintaxe complicada de nome de objeto do Git (você usaria git rev-parsepara alterar ou "massagear" certos parâmetros na linha de comando antes do programa real é chamado).
Veja também github.com/git/git/commit/…
VonC
60
A página de manual para git rev-parseé ridiculamente incompreensível. Estou surpreso que ninguém tenha se incomodado em reescrever esse jargão em algo legível por humanos, mesmo depois de cinco anos.
Not2qubit
@ not2qubit Me: 'Obrigado por esclarecer, eu estava me sentindo inferior.' Linus Torvalds: 'Reli, exatamente que parte você não compreendeu?'
Brain2000

Respostas:

245

git rev-parseé um plumbingcomando auxiliar usado principalmente para manipulação.

Um uso comum git rev-parseé imprimir os hashes SHA1, com um especificador de revisão. Além disso, possui várias opções para formatar essa saída, como --shortpara imprimir um SHA1 exclusivo mais curto.

Também existem outros casos de uso (em scripts e outras ferramentas criadas sobre o git) que eu usei para:

  • --verify para verificar se o objeto especificado é um objeto git válido.
  • --git-dirpara exibir o caminho abs / relativo do .gitdiretório
  • Verificando se você está atualmente dentro de um repositório usando --is-inside-git-dirou dentro de uma árvore de trabalho usando--is-inside-work-tree
  • Verificando se o repositório está vazio usando --is-bare-repository
  • A impressão de hashes SHA1 de ramos ( --branches), tags ( --tags) e os refs também pode ser filtrada com base no controle remoto (usando --remote)
  • --parse-optnormalizar argumentos em um script (semelhante a getopt) e imprimir uma sequência de saída que possa ser usada comeval

Massageimplica apenas que é possível converter as informações de um formulário para outro, ou seja, um comando de transformação. Estes são alguns exemplos rápidos em que consigo pensar:

  • um nome de filial ou tag no SHA1 da confirmação para o qual está apontando, para que possa ser passado para um comando de canalização que aceita apenas valores SHA1 para a confirmação.
  • um intervalo de revisão A..Bpara git logou git diffnos argumentos equivalentes para o comando de encanamento subjacente, comoB ^A
Tuxdude
fonte
102

Apenas para elaborar a etimologia do nome do comando rev-parse, o Git usa consistentemente o termo revem comandos de canalização, abreviação de "revisão" e geralmente significa o hash SHA1 de 40 caracteres para uma confirmação. O comando, rev-listpor exemplo, imprime uma lista de hashes de confirmação de 40 caracteres para uma ramificação ou qualquer outra coisa.

Nesse caso, o nome pode ser expandido para parse-a-commitish-to-a-full-SHA1-hash. Embora o comando tenha as várias funções auxiliares mencionadas na resposta do Tuxdude, seu homônimo parece ser o caso de uso de transformar uma referência amigável como um nome de filial ou hash abreviado no hash inequívoco SHA1 de 40 caracteres mais útil para muitos programas / encanamentos propósitos.

Eu sei que eu estava pensando que era "analisar reversamente" algo por um bom tempo antes de descobrir e tive o mesmo problema de entender os termos "massageando" e "manipulação" :)

De qualquer forma, acho essa noção de "analisar para uma revisão" uma maneira satisfatória de pensar sobre ela, e um conceito confiável para trazer esse comando à mente quando preciso desse tipo de coisa. Freqüentemente, no script Git, você usa uma referência de confirmação amigável como entrada do usuário e geralmente deseja resolvê-la para uma referência de trabalho validada e inequívoca assim que recebê-la. Caso contrário, a tradução e a validação de entrada tendem a proliferar através do script.

scanny
fonte
9
Obrigado pela explicação, eu não entendia o git-docs um pouco: git-scm.com/docs/git-rev-parse
Jacob McKay
você pode nos dar um exemplo messaginge manipulationcomo você alude antes?
Bo Chen
5
Em outras palavras, git rev-parseé a abreviação de git revision-parse. Ele pega a entrada fornecida e retorna o ID de revisão de 40 caracteres correspondente.
Jonathan Benn
36

git rev-parseTambém funciona para obter o nome do ramo atual usando o sinalizador --abbrev-ref como:

git rev-parse --abbrev-ref HEAD
mitra
fonte
É popsible receber uma mensagem de confirmação dessa maneira?
Leo Droidcoder
2
@LeoDroidcoder trygit log --format=%B -n 1 <revision>
hipyhop