2009-01-20 15 views
32

He añadido un archivo en el 'índice' con:Git - encontrar el SHA1 de un archivo individual en el índice

git add myfile.java 

¿Cómo encuentro el SHA1 de este archivo?

+1

Solo como referencia: Tipo de [la pregunta inversa] (http://stackoverflow.com/questions/460331/git-finding-a-filename-from-a-sha1) – Albert

+2

'git rev-parse: myfile.java' – jthill

+0

@jthill, no estoy seguro de por qué esto no es una respuesta en sí mismo. – akhan

Respuesta

48

desea que la opción -s-git ls-files. Esto le proporciona el modo y el hash sha1 del archivo en el índice.

git ls-files -s myfile.java 

Tenga en cuenta que usted no quiere git hash-object ya que esto le da la Identificación SHA1 del archivo en el directorio de trabajo, ya que actualmente es, no del archivo que ha agregado al índice. Estos serán diferentes una vez que realice cambios en la copia del árbol de trabajo después del git add.

+2

Cómo obtener el archivo real SHA1 * de git *, como 'sha1sum README.md'? –

18
$ git hash-object myfile.java 
802992c4220de19a90767f3000a79a31b98d0df7 
+0

¡Muchas gracias! - Eso hizo el truco. –

+9

He aquí por qué esta respuesta recibió una calificación peor que la de Charles: esto realmente le da el SHA1 de la versión del archivo que está en el árbol de trabajo, no de la versión indexada/por etapas. También tiene la desventaja de que necesita recalcular el SHA1 incluso si ya está almacenado en el índice. –

+0

@ JanKrüger ¡Gracias por aclarar eso! Muy útil. Ahora, 'git hash-object' sigue siendo útil para algo, ya que de lo contrario uno tendría que hacer algo como' (perl -e '$ size = (-s shift); print "blob $ size \ x00"' foo.txt && cat foo.txt) | openssl sha1'. Además, produce el hash por sí mismo, mientras que el 'ls-files -s' parece requerir un poco de 'corte' para aislar ese hash. –

59

Es una vieja pregunta, pero una cosa necesita alguna aclaración:

Esta pregunta y las respuestas a continuación habla de el hash Git de un fichero del cual es no es exactamente el mismo que"el SHA1 de esta archivo " como se le preguntó en la pregunta.

En resumen:

Si desea obtener el Git hash del archivo en el índice de - ver the answer by Charles Bailey:

git ls-files -s $file 

Si desea obtener el Git de hash de cualquier archivo en su sistema de archivos - ver the answer by cnu:

git hash-object $file 

Si desea obtener el Git de hash de cualquier archivo en el sistema de archivos y no tiene Git instalado:

(echo -ne "blob `wc -c < $file`\0"; cat $file) | sha1sum 

(Lo anterior muestra cómo el hash Git es en realidad computa - No es el sha1 suma del archivo, pero una suma SHA1 de la cadena "blob tAMAÑO \ 0CONTENT" donde "blob" es literalmente una cadena "blob" (que es seguido por un espacio), tAMAÑO el tamaño del archivo en bytes (un decimal ASCII), "\ 0" es el carácter nulo y CONTENIDO es el contenido real del archivo).

Si desea obtener sólo "el SHA1 de este archivo" como estaba, literalmente, le preguntó en la pregunta:

sha1sum < $file 

Si usted no tiene sha1sum puede utilizar shasum -a1 o openssl dgst -sha1 (con una formato de salida ligeramente diferente).

+2

Excelente respuesta, quiero votar dos veces por la solución de cálculo-hash-no-Git. – javabrett

Cuestiones relacionadas