sirve - Git: encontrar un nombre de archivo de un SHA1
sha-1 git que es (5)
Confirme el archivo y tenga en cuenta el hash sha1 del objeto de confirmación. Después de ese uso
git ls-tree <commit-sha1>
y obtendrá los nombres de los archivos con los hashes.
Verifique las páginas del manual para más opciones.
Agregué un archivo al índice con:
git add somefile.txt
Luego obtuve el SHA1 para este archivo con:
git hash-object somefile.txt
Ahora tengo un SHA1 y me gustaría recuperar el nombre de archivo del objeto en el índice usando el SHA1.
git show 5a5bf28dcd7944991944cc5076c7525439830122
Este comando devuelve el contenido del archivo pero no el nombre del archivo.
¿Cómo obtengo el nombre de archivo completo y la ruta de regreso de SHA1?
El siguiente script de shell se basa en gran medida en ¿Qué compromiso tiene este blob? y la respuesta proporcionada por Aristóteles Pagaltzis.
#!/bin/sh
obj_hash=$1
# go over all trees
git log --pretty=format:''%T %h %s'' /
| while read tree commit subject ; do
git ls-tree -r $tree | grep "$obj_hash" /
| while read a b hash filename ; do
if [ "$hash" == "$obj_hash" ]; then
f=$filename
echo $f
break
fi
if $f ; then break; fi
done
if $f; then break; fi
done
Estoy seguro de que alguien podría embellecer este script, pero funciona. La idea es mirar todos los árboles comprometidos y buscar su hash específico.
Gran one-liner para hacer esto:
git rev-list --objects --all | grep <blob sha1>
No existe tal mapeo directo en git ya que el nombre del archivo es parte del objeto del árbol que contiene el archivo, no del objeto blob que es el contenido del archivo.
No es una operación habitual querer recuperar un nombre de archivo de un hash SHA1, así que ¿podría expandirlo en un caso de uso del mundo real?
Si está buscando archivos actuales (es decir, la confirmación HEAD), puede intentar lo siguiente.
git ls-tree -r HEAD | grep <SHA1>
Si desea encontrar los contenidos en las confirmaciones anteriores, deberá hacer algo más como esto.
git rev-list <commit-list> | /
xargs -n1 -iX sh -c "git ls-tree -r X | grep <SHA1> && echo X"
git rev-list <commit-list>
no incluirá commits que fueron removidos por rebase -i
y ahora son referenciados solo por reflog, por lo que si blob no se encuentra por el comando anterior, también debe verificar reflog ie así:
git reflog --all | /
cut -d/ -f1 | /
xargs -n1 -iX sh -c "git ls-tree -r X | grep <BLOB_SHA> && echo X"