¿Cómo encontrar el hash de la rama en Git?

88

Dado un nombre de rama local / remota, ¿cómo podría obtener el hash de la confirmación a la que apunta esta rama?

Misha Moroshko
fuente

Respuestas:

143

El comando git rev-parsees tu amigo, por ejemplo:

$ git rev-parse development
17f2303133734f4b9a9aacfe52209e04ec11aff4

... o para una sucursal de seguimiento remoto:

$ git rev-parse origin/master
da1ec1472c108f52d4256049fe1f674af69e785d

Este comando es generalmente muy útil, ya que puede analizar cualquiera de las formas de especificar nombres de sucursales git, como:

git rev-parse master~3
git rev-parse HEAD@{2.days.ago}

... etc.

Mark Longair
fuente
¿Cómo puedo ver todo el hash de confirmación de una sucursal local?
Mahdi
1
@Kenji: probablemente deberías crear una nueva pregunta para eso, pero si solo quieres los hash de cada confirmación en una rama foo, puedes hacer:git log --pretty=format:'%H'
Mark Longair
cuando estoy corriendo la línea siguiente en JenkinsFile: def BranchHash = sh "git rev-parse ${BRANCH-NAME}Estoy recibiendo: fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.. ¿qué está mal?
Arielma
5

Los hashes se almacenan en .git/refs/, p. Ej..git/refs/heads/master

Pero utilícelo programáticamente git rev-parsecomo lo sugiere Mark Longair, ya que es más seguro.

Mark Fisher
fuente
2

No olvide que desde Git 2.19 (Q2 2018), Git prepara una transición de hashes SHA1 a SHA2: consulte " ¿Por qué Git no usa SHA más moderno? "

Con Git 2.25 (Q1 2020), git rev-parseevoluciona y refleja ese posible nuevo hash.

Ver cometer fa26d5e , comprometerse cf02be8 , comprometerse 38ee26b , comprometerse 37ab8eb , comprometerse 0370b35 , comprometerse 0253e12 , comprometerse 45e2ef2 , comprometerse 79b0edc , comprometerse 840624f , comprometerse 32a6707 , comprometerse 440bf91 , comprometerse 0b408ca , comprometerse 2eabd38 (28 de octubre 2019), y comprometerse 1bcef51 , cometen ecde49b (05 de octubre de 2019) por brian m. carlson ( bk2204) .
(Combinado por Junio ​​C Hamano - gitster- en el compromiso 28014c1, 10 de noviembre de 2019)

rev-parse: agregar una --show-object-formatopción

Firmado por: brian m. carlson

Agregue una opción para imprimir el formato de objeto utilizado para entrada, salida o almacenamiento.
Esto permite que los scripts de shell descubran el algoritmo hash en uso.

Dado que el plan de transición permite múltiples algoritmos de entrada, documente que podemos proporcionar múltiples resultados para la entrada y el formato que pueden tomar los resultados.
Si bien no admitimos esto ahora, documentarlo temprano significa que los autores de scripts pueden preparar sus scripts para el futuro cuando lo hagamos.

La git rev-parsedocumentación ahora incluye:

--show-object-format[=(storage|input|output)]:

Muestre el formato de objeto (algoritmo hash) utilizado para el repositorio para el almacenamiento dentro del .gitdirectorio, entrada o salida. Para la entrada, se pueden imprimir múltiples algoritmos, separados por espacios. Si no se especifica, el valor predeterminado es "almacenamiento".


Con Git 2.29 (Q4 2020), puede asegurarse de qué formato debe usar para leer la confirmación de hash de una rama (o cualquier otro objeto).

Ver cometer e023ff0 , comprometerse 4feb562 , comprometerse 8a06d56 , comprometerse c49fe07 , comprometerse 02a32db , comprometerse ceaa4b3 , comprometerse eff45da , comprometerse b5b46d7 , comprometerse c5aecfc , comprometerse e74b606 , comprometerse 439d3a1 , comprometerse 6c2adf8 , comprometerse de5737c , comprometerse e0a646e , comprometerse 6ff6a67 , comprometerse 831279d , cometen b6e5005 , confirma 287bb3a , confirma 22f1824 , confirma db00af9 ,cometer 7187eb1 , cometer 98de0b2 , cometer a5587b8 , cometer 66b6d43 , cometer 2197f87 , cometer c0b65ea , cometer d62607d , cometer d482c23 , cometer 866be6e , cometer 4bacb6d , cometer 252a4ee , cometer 368f3cb , cometer abe3db1 , cometer 08fbc5d , cometer 11b6961 , cometer 9e3bd8a , cometer d827bce , comete 094a685 (29 de julio de 2020) por brian m. carlson ( bk2204) .
Vercommit 800e6a7 (29 de julio de 2020) por Johannes Schindelin ( dscho) .
(Combinado por Junio ​​C Hamano - gitster- en el compromiso e0ad957 , 11 de agosto de 2020)

docs: agregar documentación para extensions.objectFormat

Firmado por: brian m. carlson
Revisado por: Eric Sunshine

Documente la extensions.objectFormatconfiguración de configuración.
Advertir a los usuarios que no lo modifiquen ellos mismos.

git configahora incluye en su página de manual :

extensions.objectFormat

Especifique el algoritmo hash que se utilizará.

Los valores aceptables son sha1y> sha256.
Si no se especifica, sha1se asume.
Es un error especificar esta clave a menos que core.repositoryFormatVersionsea ​​1.

Tenga en cuenta que esta configuración solo debe establecerse mediante git inito git clone.
Intentar cambiarlo después de la inicialización no funcionará y producirá problemas difíciles de diagnosticar.


Para ser claros, con Git 2.29 (Q4 2020), la reciente adición de soporte SHA-256 está marcada como experimental en la documentación.

Consulte la confirmación ff233d8 (16 de agosto de 2020) de Martin Ågren ( none) .
(Combinado por Junio ​​C Hamano - gitster- en el compromiso d1ff741 , 24 de agosto de 2020)

Documentation: marcar --object-format=sha256como experimental

Firmado por: Martin Ågren

Después de eff45daab8 (" repository: habilita la compatibilidad con SHA-256 de forma predeterminada", 2020-07-29, Git v2.29.0 - la combinación aparece en el lote n. ° 6 ), las compilaciones vanilla de Git permiten al usuario ejecutar, por ejemplo,

git init --object-format=sha256  

y hackear.
Esta puede ser una buena forma de adquirir experiencia con el mundo SHA-256, por ejemplo, para encontrar errores que

GIT_TEST_DEFAULT_HASH=sha256 make test  

no mancha.

Pero realmente es un mundo separado: tales repositorios SHA-256 vivirán completamente separados del conjunto (ahora bastante grande) de repositorios SHA-1.
Interactuar a través de la frontera es posible en principio, por ejemplo, a través de " diff+ apply" (o " format-patch+ am"), pero incluso eso tiene sus limitaciones: la aplicación de una diferencia de SHA-256 en un repositorio SHA-1 funciona en el caso simple, pero si necesita recurrir -3, no tiene suerte.

De manera similar, " push+ pull" debería funcionar, pero realmente estará operando mayoritariamente desplazado del resto del mundo. Eso podría estar bien para cuando inicialices tu repositorio, y podría estar bien durante varios meses después de eso, pero podría llegar un día en el que comiences a lamentar tu uso de [git init --object-format = sha256 ](https://github.com/git/git/blob/ff233d8dda12657a90d378f2b403bc6c85838c59/Documentation/git-init.txt#L52)<sup>([man](https://git-scm.com/docs/git-init#Documentation/git-init.txt---object-formatltformatgt))</sup>y tienes cavó usted mismo en un agujero bastante profundo.

Actualmente hay temas en curso para documentar nuestros formatos de datos y protocolos con respecto a SHA-256 y, en algunos casos (midx y commit-graph), estamos considerando ajustar cómo los formatos de archivo indican qué formato de objeto usar.

Dondequiera que --object-formatse mencione en nuestra documentación, dejemos en claro que usarlo con "sha256" es experimental.
Si más tarde necesitamos explicar por qué no podemos manejar los datos que generamos en 2020, siempre podemos señalar este párrafo que estamos agregando aquí.

Al "incluir ::" - al hacer una pequeña propaganda, deberíamos ser consistentes en toda la documentación y eventualmente reducir gradualmente la severidad de este texto.
Un día, incluso podríamos usarlo para comenzar a eliminar --object-format=sha1, pero no nos adelantemos ...

También hay extensions.objectFormat, pero solo se menciona tres veces. Dos veces agregamos este nuevo descargo de responsabilidad y en el tercer lugar ya tenemos una advertencia de "no editar". A partir de ahí, los lectores interesados ​​deberían eventualmente encontrar este nuevo que estamos agregando aquí.

Dado que GIT_DEFAULT_HASHproporciona otro punto de entrada a esta funcionalidad, documente también su naturaleza experimental.

gitahora incluye en su página de manual :

se utiliza en su lugar. El valor predeterminado es "sha1". ¡ESTA VARIABLE ES EXPERIMENTAL! Ver --object-formaten git init.

object-format-disclaimerahora incluye en su página de manual :

¡ESTA OPCIÓN ES EXPERIMENTAL!
La compatibilidad con SHA-256 es experimental y aún se encuentra en una etapa inicial.

Un repositorio SHA-256 en general no podrá> compartir trabajo con repositorios SHA-1 "normales".
Se debe suponer que, por ejemplo, los formatos de archivo internos de Git en relación con los repositorios SHA-256 pueden cambiar de manera incompatible con versiones anteriores.
Úselo únicamente --object-format=sha256con fines de prueba.


El mismo Git 2.29 (Q4 2020) asegura que " git clone" ( man ) funcionará cuando se clone desde el repositorio SHA-1, mientras que ya GIT_DEFAULT_HASHestá configurado para usar SHA-256.
Antes de la 2.29, eso resultó en un repositorio inutilizable que afirma ser un repositorio SHA-256 con objetos SHA-1 y referencias.
Esto ha sido corregido.

Consulta el compromiso 47ac970 (20 de septiembre de 2020) de brian m. carlson ( bk2204) .
(Combinado por Junio ​​C Hamano - gitster- en el compromiso b28919c , 29 de septiembre de 2020)

builtin/clone: evitar fallas con GIT_DEFAULT_HASH

Reportado por: Matheus Tavares
Firmado por: brian m. carlson

Si un usuario está clonando un repositorio SHA-1 con el GIT_DEFAULT_HASHvalor " sha256", entonces podemos terminar con un repositorio donde la versión del formato del repositorio es 0 pero la extensions.objectformatclave está establecida en " sha256".
Esto es incorrecto (el usuario tiene un repositorio SHA-1) y no es funcional (porque la extensión no se puede usar en un repositorio v0).

Esto sucede porque en un clon, inicialmente configuramos el repositorio y luego cambiamos su algoritmo según lo que el lado remoto nos dice que está usando.
Inicialmente configuramos el repositorio como SHA-256 en este caso, y luego restablecimos la versión del repositorio sin borrar la extensión.

En este caso, siempre podríamos configurar la extensión, pero eso significaría que nuestros repositorios SHA-1 no eran compatibles con versiones anteriores de Git, aunque no hay ninguna razón por la que no deberían serlo.
Y tampoco queremos inicializar el repositorio como SHA-1 inicialmente, ya que eso significa que si estamos clonando un repositorio vacío, no habremos cumplido con la GIT_DEFAULT_HASHvariable y terminaremos con un repositorio SHA-1, no un repositorio SHA-256.

Ninguno de los dos es atractivo, así que digamos al código de inicialización del repositorio si estamos haciendo un reinicio como este, y si es así, borremos la extensión si estamos usando SHA-1.
Esto asegura que produzcamos un repositorio válido y funcional y no rompa ninguno de nuestros otros casos de uso.

VonC
fuente