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
--verify
implica que:The parameter given must be usable as a single, valid object name. Otherwise barf and abort.
git rev-parse --short HEAD
devuelve 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=N
se 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 HEAD
ogit 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 log
es de porcelana ygit rev-parse
es fontanería.git checkout 33aa44; git log -n 1
me 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
.HEAD
puntos 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
git
commit
se necesitan dos valores hash, como uno delbranch
que está trabajando actualmente y amaster
branch
, también podría usarlogit rev-parse FETCH_HEAD
si necesita el valor hash para elmaster
commit
que utilizómerge
en su actualbranch
. por ejemplo, si tienebranch
esmaster
yfeature/new-feature
para un repositorio determinado, mientras está encendidofeature/new-feature
, puede usarlogit fetch origin master && git merge FETCH_HEAD
y luegogit rev-parse --short FETCH_HEAD
si necesita elcommit
hash delmaster
que acaba demerge
acceder para cualquier script que pueda tener.Para completar, ya que nadie lo ha sugerido todavía.
.git/refs/heads/master
es 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/HEAD
normalmente apunta a una referencia, si tiene un SHA1 allí, está en modo de cabezal separado..git
subdirectorio, que no es necesariamente el caso. Vea la--separate-git-dir
bandera en lagit init
página del manual.Cometer hash
Comportamiento abreviado hash
Haga clic aquí para más
git show
ejemplos.fuente
Siempre hay
git describe
también. Por defecto te da -fuente
git describe --long --dirty --abbrev=10 --tags
, me dará algo así como7.2.0.Final-447-g65bf4ef2d4
447 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--always
opción significa que proporciona un resultado (hash) incluso si no hay etiquetas. Esto--first-parent
significa 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--dirty
agregará-dirty
al resultado si la rama actual tiene cambios no confirmados.Utilizar
git rev-list --max-count=1 HEAD
fuente
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
--short
o--short=number
paragit 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 show
es 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 show
paraporcelain
.--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 lastcommit
para 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=0
sha1 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:
f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe
fuente
--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-ref
me 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-ref
aplica 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
git
comando no se ha instalado.Si no funciona, verifique en la
.git/refs/heads
carpeta 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/master
Analí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/master
Este 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:
master
fuente