Me gustaría conservar (por ahora) la capacidad de vincular los conjuntos de cambios de Git a los elementos de trabajo almacenados en TFS.
Ya escribí una herramienta (usando un gancho de Git) en la que puedo inyectar identificadores de trabajo en el mensaje de un conjunto de cambios de Git.
Sin embargo, también me gustaría almacenar el identificador de la confirmación Git (el hash) en un campo de elemento de trabajo TFS personalizado. De esta forma puedo examinar un elemento de trabajo en TFS y ver qué conjuntos de cambios de Git están asociados con el elemento de trabajo.
¿Cómo puedo recuperar fácilmente el hash del commit actual de Git?
fuente

--verifyimplica que:The parameter given must be usable as a single, valid object name. Otherwise barf and abort.git rev-parse --short HEADdevuelve la versión corta del hash, por si alguien se lo preguntaba.--short, como--short=12, para obtener un número específico de dígitos a partir del hash.--short=Nse trata de un número mínimo de dígitos; git usa un mayor número de dígitos si acortado uno sería indistinguible de otro acortado acortar. Prueba, por ejemplo,git rev-parse --short=2 HEADogit log --oneline --abbrev=2.git rev-parse HEAD | GREP_COLORS='ms=34;1' grep $(git rev-parse --short=0 HEAD)Si solo quieres el hash acortado:
Además, usar% H es otra forma de obtener el hash largo.
fuente
git loges de porcelana ygit rev-parsees fontanería.git checkout 33aa44; git log -n 1me da33aa44. ¿Qué versión de git estás usando?Otro, usando git log:
Es muy similar al de @outofculture, aunque un poco más corto.
fuente
HEAD.HEADpuntos de confirmación específicos para esta confirmación en lugar de una rama con nombre conocida como cabeza separada .Para obtener el SHA completo:
Para obtener la versión abreviada:
fuente
gitcommitse necesitan dos valores hash, como uno delbranchque está trabajando actualmente y amasterbranch, también podría usarlogit rev-parse FETCH_HEADsi necesita el valor hash para elmastercommitque utilizómergeen su actualbranch. por ejemplo, si tienebranchesmasteryfeature/new-featurepara un repositorio determinado, mientras está encendidofeature/new-feature, puede usarlogit fetch origin master && git merge FETCH_HEADy luegogit rev-parse --short FETCH_HEADsi necesita elcommithash delmasterque acaba demergeacceder para cualquier script que pueda tener.Para completar, ya que nadie lo ha sugerido todavía.
.git/refs/heads/masteres un archivo que contiene solo una línea: el hash de la última confirmaciónmaster. Entonces puedes leerlo desde allí.O, como comando:
Actualizar:
Tenga en cuenta que git ahora admite el almacenamiento de algunas referencias de cabeza en el archivo pack-ref en lugar de como un archivo en la carpeta / refs / heads /. https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html
fuente
master, lo cual no es necesariamente cierto.master..git/HEADnormalmente apunta a una referencia, si tiene un SHA1 allí, está en modo de cabezal separado..gitsubdirectorio, que no es necesariamente el caso. Vea la--separate-git-dirbandera en lagit initpágina del manual.Cometer hash
Comportamiento abreviado hash
Haga clic aquí para más
git showejemplos.fuente
Siempre hay
git describetambién. Por defecto te da -fuente
git describe --long --dirty --abbrev=10 --tags, me dará algo así como7.2.0.Final-447-g65bf4ef2d4447 confirmaciones después de la etiqueta 7.2.0.Final y los primeros 10 diálogos del SHA-1 global en el HEAD actual son "65bf4ef2d4". Esto es muy bueno para las cadenas de versión. Con --long siempre agregará el conteo (-0-) y el hash, incluso si la etiqueta coincide exactamente.git describe --always"mostrará un objeto de confirmación abreviado de forma única como reserva"git describe --tags --first-parent --abbrev=11 --long --dirty --always. La--alwaysopción significa que proporciona un resultado (hash) incluso si no hay etiquetas. Esto--first-parentsignifica que no se confunde con las confirmaciones de fusión y solo sigue los elementos de la rama actual. Tenga en cuenta también que se--dirtyagregará-dirtyal resultado si la rama actual tiene cambios no confirmados.Utilizar
git rev-list --max-count=1 HEADfuente
Si necesita almacenar el hash en una variable durante un script, puede usar
O, si solo quieres los primeros 10 caracteres (como lo hace github.com)
fuente
--shorto--short=numberparagit rev-parse; No es necesario utilizar una tubería ycut.Si quieres la forma súper hacky de hacerlo:
Básicamente, git almacena la ubicación de HEAD en .git / HEAD, en el formulario
ref: {path from .git}. Este comando lee eso, corta el "ref:" y lee cualquier archivo al que apunte.Esto, por supuesto, fallará en el modo de cabeza separada, ya que HEAD no será "ref: ...", sino el hash en sí mismo, pero ya sabes, no creo que esperes tanta inteligencia en tu golpe. -liners. Sin embargo, si no crees que el punto y coma son trampas ...
fuente
sh. Media hora de comentarios de documentación más tarde, y aquí hay un resumenLa forma más sucinta que conozco:
Si desea un número específico de dígitos del hash, puede agregar:
fuente
git showes lo que se conoce como un comando de porcelana (es decir, orientado al usuario), por lo que no debe usarse en scripts porque su salida está sujeta a cambios. La respuesta anterior (git rev-parse --short HEAD) debe usarse en su lugar.git help showparaporcelain.--porcelain, por lo que esto es confuso. Puedes encontrar los detalles en esta gran respuesta de VonCQuizás desee un alias para no tener que recordar todos los detalles ingeniosos. Después de realizar uno de los pasos a continuación, simplemente podrá escribir:
Después de la respuesta aceptada , aquí hay dos formas de configurar esto:
1) Enseñe a git de manera explícita editando la configuración global (mi respuesta original):
2) O si le gusta un atajo para enseñarle un atajo, como comentó recientemente Adrien:
De aquí en adelante, use
git lastcommitpara mostrar el hash del último commit.fuente
git config --global alias.lastcommit "rev-parse HEAD"Necesitaba algo un poco más diferente: mostrar el sha1 completo de la confirmación, pero agregue un asterisco al final si el directorio de trabajo no está limpio. A menos que quiera usar varios comandos, ninguna de las opciones en las respuestas anteriores funciona.
Aquí está el único revestimiento que hace:
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"Resultado:
f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*Explicación: describe (usando etiquetas anotadas) el commit actual, pero solo con etiquetas que contienen "NOT A TAG". Como las etiquetas no pueden tener espacios, esto nunca coincide con una etiqueta y dado que queremos mostrar un resultado
--always, el comando retrocede mostrando el--abbrev=0sha1 completo ( ) de la confirmación y agrega un asterisco si el directorio de trabajo lo es--dirty.Si no desea agregar el asterisco, esto funciona como todos los otros comandos en las respuestas anteriores:
git describe --always --abbrev=0 --match "NOT A TAG"Resultado:
f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffefuente
--match "NOT A TAG". Probado en git 2.18.0 y 2.7.4. ¿Hay alguna situación en la que se necesite este argumento?Si vas por la velocidad, el enfoque mencionado por Deestan
es significativamente más rápido que cualquier otro método enumerado aquí hasta ahora.
fuente
show-refme parece ser la mejor opción para secuencias de comandos, ya que es un comando de plomería y así garantizado (o al menos muy probable) se mantenga estable en futuras versiones: otras respuestas utilizanrev-parse,show,describe, olog, que son todos los comandos de porcelana. Y en los casos en que la velocidad no es esencial, seshow-refaplica la nota de la página de manual: 'Se recomienda el uso de esta utilidad a favor de acceder directamente a los archivos en el directorio .git'.Aquí hay una línea en el shell Bash que usa lectura directa de archivos git:
Debe ejecutar el comando anterior en su carpeta raíz git.
Este método puede ser útil cuando tiene archivos de repositorio, pero el
gitcomando no se ha instalado.Si no funciona, verifique en la
.git/refs/headscarpeta qué tipo de cabezas tiene presente.fuente
en su directorio de inicio en el archivo ".gitconfig" agregue lo siguiente
entonces tendrás un comando más fácil de recordar:
fuente
En git bash, simplemente ejecute $ git log -1
verá, estas líneas siguiendo su comando.
fuente
Aquí hay otra implementación de acceso directo:
Esto también funciona sobre http, que es útil para archivos de paquetes locales (lo sé: para sitios web públicos no se recomienda hacer accesible el directorio .git):
fuente
Aquí hay otra forma de hacerlo :)
fuente
Salida de ejemplo:
ref: refs/heads/masterAnalízalo:
cat .git/HEAD | sed "s/^.\+ \(.\+\)$/\1/g"Si tiene Windows, entonces puede considerar usar wsl.exe:
wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g"Salida:
refs/heads/masterEste valor puede usarse para git checkout más tarde, pero se convierte en apuntando a su SHA. Para que apunte a la rama actual actual por su nombre, haga lo siguiente:
wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g" | wsl sed "s/^refs\///g" | wsl sed "s/^heads\///g"Salidas:
masterfuente