2009-01-20 12 views
28

he añadido un archivo en el índice con:Git - la búsqueda de un nombre de archivo de un SHA1

git add somefile.txt 

entonces me dieron el SHA1 para este archivo con:

git hash-object somefile.txt 

ahora tengo una SHA1 y Me gustaría recuperar el nombre del 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 desde SHA1?

+0

[pregunta relacionada] (http://stackoverflow.com/questions/223678/which-commit-has-this-blob) – Albert

Respuesta

23

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 usted quiere encontrar el contenido en anteriores comete tendrá que 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" 
+0

Gracias por eso. No sabía que podía hacer eso – Jonathan

+5

Si no sabe qué incluir en '', '--all' buscará en todas las ramas del repositorio. – EoghanM

+1

Mi versión de 'git ls-tree' solo acepta 1 revisión como argumento (git v1.7.4.4).Adapte el tuyo a 'por rev en $ (git rev-list --all); hacer git ls-tree -r $ rev | grep $ SHA; hecho | uniq' –

1

Confirme el archivo y tenga en cuenta el hash sha1 del objeto de confirmación. Después de eso use

git ls-tree <commit-sha1> 

y obtendrá los nombres de los archivos con los valores hash.

Consulte las páginas del manual para ver más opciones.

+0

Esa es la de comprometerse SHA, el OP pregunta sobre el SHA del archivo. –

7

El siguiente script se basa principalmente en Which commit has this blob? y la respuesta dada 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.

2

git rev-list <commit-list> no incluirá ningún commit que eran, por ejemplo, eliminado por rebase -i y ahora están referidos únicamente por reflog, por lo que si no se encuentra burbuja por comando anterior debe comprobar también reflog es decir, como esto:

git reflog --all | \ 
cut -d\ -f1 | \ 
xargs -n1 -iX sh -c "git ls-tree -r X | grep <BLOB_SHA> && echo X" 
20
Gran

de una sola línea para hacer esto:

git rev-list --objects --all | grep <blob sha1> 
Cuestiones relacionadas