Gostaria de manter (por enquanto) a capacidade de vincular conjuntos de alterações do Git a itens de trabalho armazenados no TFS.
Eu já escrevi uma ferramenta (usando um gancho do Git) na qual posso injetar identificadores de trabalho na mensagem de um conjunto de alterações do Git.
No entanto, eu também gostaria de armazenar o identificador do commit do Git (o hash) em um campo de item de trabalho TFS personalizado. Dessa forma, posso examinar um item de trabalho no TFS e ver quais conjuntos de alterações do Git estão associados ao item de trabalho.
Como posso recuperar facilmente o hash do commit atual do Git?
fonte
--verify
implica que:The parameter given must be usable as a single, valid object name. Otherwise barf and abort.
git rev-parse --short HEAD
retorna a versão curta do hash, caso alguém esteja se perguntando.--short
, por exemplo--short=12
, obter um número específico de dígitos do hash.--short=N
trata-se de um número mínimo de dígitos; O git usa um número maior de dígitos se um menor for indistinguível de outro commit reduzido. Tente, por exemplo,git rev-parse --short=2 HEAD
ougit log --oneline --abbrev=2
.git rev-parse HEAD | GREP_COLORS='ms=34;1' grep $(git rev-parse --short=0 HEAD)
Se você deseja apenas o hash reduzido:
Além disso, o uso de% H é outra maneira de obter o hash longo.
fonte
git log
é porcelana egit rev-parse
é encanamento.git checkout 33aa44; git log -n 1
me dá33aa44
. Qual versão do git você está usando?Outro, usando o git log:
É muito semelhante ao da @outofculture, embora um pouco mais curto.
fonte
HEAD
.HEAD
aponte para esse commit em vez de um branche nomeado conhecido como head desanexado .Para obter o SHA completo:
Para obter a versão abreviada:
fonte
git
commit
hashes forem necessários, como um do qualbranch
você está trabalhando no momento e amaster
branch
, você também poderá usá-git rev-parse FETCH_HEAD
lo se precisar do hash para omaster
commit
que vocêmerge
encontrou no seu atualbranch
. por exemplo, se você tembranch
esmaster
efeature/new-feature
para um determinado repositório., enquanto estiver usando,feature/new-feature
você pode usargit fetch origin master && git merge FETCH_HEAD
e, em seguida,git rev-parse --short FETCH_HEAD
se precisar docommit
hash do qualmaster
você acabou de semerge
dedicar a qualquer script que possa ter.Para ser completo, já que ninguém o sugeriu ainda.
.git/refs/heads/master
é um arquivo que contém apenas uma linha: o hash da confirmação mais recente emmaster
. Então você pode ler a partir daí.Ou, como comando:
Atualizar:
Note que o git agora suporta o armazenamento de algumas referências de cabeça no arquivo pack-ref em vez de como um arquivo na pasta / refs / heads /. https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html
fonte
master
, o que não é necessariamente verdadeiro.master
..git/HEAD
normalmente aponta para um juiz, se você tiver um SHA1 lá, você está no modo de cabeça desanexada..git
subdiretório, o que não é necessariamente o caso. Veja a--separate-git-dir
bandeira nagit init
página de manual.Confirmar hash
Hash de confirmação abreviado
Clique aqui para mais
git show
exemplos.fonte
Sempre há
git describe
também. Por padrão, ele fornece -fonte
git describe --long --dirty --abbrev=10 --tags
que isso me dará algo do tipo7.2.0.Final-447-g65bf4ef2d4
447 confirmado após a tag 7.2.0.Final e os 10 primeiros resumos do SHA-1 global no HEAD atual são "65bf4ef2d4". Isso é muito bom para cadeias de versão. Com --long, ele sempre adiciona a contagem (-0-) e o hash, mesmo que a tag coincida exatamente.git describe --always
vai "mostrar exclusivamente abreviado cometer objeto como fallback"git describe --tags --first-parent --abbrev=11 --long --dirty --always
. A--always
opção significa que ele fornece um resultado (hash), mesmo que não haja tags. Os--first-parent
meios que não são confundidos por confirmações de mesclagem e seguem apenas itens na ramificação atual. Observe também que--dirty
será anexado-dirty
ao resultado se a ramificação atual tiver alterações não confirmadas.Usar
git rev-list --max-count=1 HEAD
fonte
Se você precisar armazenar o hash em uma variável durante um script, poderá usar
Ou, se você quiser apenas os 10 primeiros caracteres (como o github.com)
fonte
--short
ou--short=number
paragit rev-parse
; não há necessidade de usar um cachimbo ecut
.Se você quiser uma maneira super hacky de fazer isso:
Basicamente, o git armazena a localização do HEAD em .git / HEAD, no formato
ref: {path from .git}
. Este comando lê isso, corta o "ref:" e lê o arquivo que ele apontou.Isso, é claro, falhará no modo de cabeça destacada, pois HEAD não será "ref: ...", mas o próprio hash - mas você sabe, eu não acho que você espere tanta inteligência em seu bash. forros. Se você não acha que ponto e vírgula estão trapaceando, ...
fonte
sh
. Meia hora de comentários de documentação mais tarde, e aqui está uma essência dele: gist.github.com/Fordi/29b8d6d1ef1662b306bfc2bd99151b07A maneira mais sucinta que eu conheço:
Se você deseja um número específico de dígitos do hash, pode adicionar:
fonte
git show
é o que é conhecido como um comando de porcelana (ou seja, voltado para o usuário) e, portanto, não deve ser usado em scripts porque sua saída está sujeita a alterações. A resposta acima (git rev-parse --short HEAD
) deve ser usada.git help show
porporcelain
.--porcelain
, e é por isso que isso é confuso. Você pode encontrar os detalhes desta ótima resposta por VonCTalvez você queira um pseudônimo para não precisar se lembrar de todos os detalhes bacanas. Depois de executar uma das etapas abaixo, você poderá digitar simplesmente:
Seguindo a resposta aceita , aqui estão duas maneiras de configurar isso:
1) Ensine o git da maneira explícita editando a configuração global (minha resposta original):
2) Ou se você gosta de um atalho para ensinar ao git um atalho, como recentemente comentado por Adrien:
A partir daqui, use
git lastcommit
para mostrar o hash do último commit.fonte
git config --global alias.lastcommit "rev-parse HEAD"
Eu precisava de algo um pouco mais diferente: exibir o sha1 completo do commit, mas anexar um asterisco ao final se o diretório de trabalho não estiver limpo. A menos que eu queira usar vários comandos, nenhuma das opções nas respostas anteriores funciona.
Aqui está o liner que faz:
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"
Resultado:
f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*
Explicação: descreve (usando tags anotadas) a confirmação atual, mas apenas com tags que contêm "NOT A TAG". Como as tags não podem ter espaços, isso nunca corresponde a uma tag e, como queremos mostrar um resultado
--always
, o comando retorna exibindo o--abbrev=0
sha1 completo ( ) do commit e acrescenta um asterisco se o diretório de trabalho estiver--dirty
.Se você não deseja anexar o asterisco, isso funciona como todos os outros comandos nas respostas anteriores:
git describe --always --abbrev=0 --match "NOT A TAG"
Resultado:
f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe
fonte
--match "NOT A TAG"
. Testado no git 2.18.0 e também no 2.7.4. Existe alguma situação em que esse argumento é necessário?Se você está buscando velocidade, a abordagem mencionada por Deestan
é significativamente mais rápido que qualquer outro método listado aqui até agora.
fonte
show-ref
parece-me ser a melhor opção para scripting, já que é um comando de canalização e assim garantido (ou pelo menos muito provável) de permanecer estável em futuras versões: outras respostas utilizarrev-parse
,show
,describe
oulog
, que são todos os comandos de porcelana. E nos casos em que a velocidade não é essencial, a nota da página deshow-ref
manual se aplica: 'O uso deste utilitário é incentivado em favor do acesso direto aos arquivos no diretório .git.'Aqui está uma linha no shell Bash usando a leitura direta de arquivos git:
Você precisa executar o comando acima na sua pasta raiz do git.
Este método pode ser útil quando você tiver arquivos de repositório, mas o
git
comando não foi instalado.Se não funcionar, verifique na
.git/refs/heads
pasta que tipo de cabeça você possui.fonte
no diretório home no arquivo ".gitconfig", adicione o seguinte
então você terá um comando mais fácil de lembrar:
fonte
No git bash, basta executar $ git log -1
você verá essas linhas seguindo seu comando.
fonte
Aqui está outra implementação de acesso direto:
Isso também funciona com http, o que é útil para arquivos de pacotes locais (eu sei: para sites públicos, não é recomendável tornar o diretório .git acessível):
fonte
Aqui está outra maneira de fazê-lo com :)
fonte
Exemplo de saída:
ref: refs/heads/master
Analise:
cat .git/HEAD | sed "s/^.\+ \(.\+\)$/\1/g"
Se você possui janelas, considere usar o wsl.exe:
wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g"
Resultado:
refs/heads/master
Esse valor pode ser usado para git checkout mais tarde, mas fica apontando para seu SHA. Para fazê-lo apontar para a ramificação atual real por seu nome, faça:
wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g" | wsl sed "s/^refs\///g" | wsl sed "s/^heads\///g"
Saídas:
master
fonte