2009-10-07 18 views
15

Usando el terminal OS X,Cómo ver los objetos e índices git sin usar git

¿Cómo ve el contenido de estos archivos como texto sin formato?

+0

Estos archivos no son inherentemente texto plano, y verlos como tal, se necesita un programa que les convierte de su formato en texto. Git es un programa con componentes diseñados para hacer precisamente eso. Me sorprendería muchísimo si alguien hubiera escrito otro. – Cascabel

+0

¿Entonces los objetos (específicamente los objetos de confirmación) no se convertirán en texto sin formato? –

+0

Son * al menos * comprimidos usando compresión zlib (desinflar). –

Respuesta

9

Mire “Object storage format” in Git User Manual.

Se trata de datos comprimidos brutos usando zlib. Se puede usar zpipe del paquete 'zlib1g-dev'. Compile the example con gcc -o zpipe zpipe.c -lz. No es un estándar .gz o algo así.

./zpipe -d < .git/objects/02/43019ddb4d94114e5a8580eec01baeea195133 

imprime el contenido de la nota (cabecera de datos +)

Si desea comprobar el SHA-1, usted tiene que poner la mancha no comprimido en un archivo (myblob) y hacer

sha1sum myblob 
+0

Desafortunadamente, esto no funciona para objetos empaquetados (unos que han estado en el repositorio por un tiempo). –

+1

¿Quiere decir que los archivos objeto contienen solo la carga útil DEFLATE y no otros campos de metadatos como se especifica en: https://www.ietf.org/rfc/rfc1952.txt, por lo que esta es la razón por la cual 'gunzip' no funcionará ? –

10

Si desea ver como texto sin formato de los objetos GIT (confirmaciones y/o manchas es decir, el contenido del archivo) sin el uso de git, que no sería fácil, especialmente si repositorio está lleno. ¿No puedes instalar git localmente en tu directorio personal (o su equivalente en MacOS X)?

El formato para objetos flojos, almacenados como archivos en .git/objects/ directorio desplegable, p. Ej. .git/objects/02/43019ddb4d94114e5a8580eec01baeea195133 (el directorio de salida de salida y el nombre de archivo forman el identificador SHA-1 del objeto), se describe, p. en Chapter 9.2 "Git Objects" del libro "Pro Git" (disponible en línea gratis) y Chapter 7.1 "How Git Stores Objects" de "Git Community Book".

paquete formato, donde el conjunto de objetos se almacena en un solo archivo en .git/objects/pack/, p. Ej. .git/objects/pack/pack-1db7aa96d95149a4dd341490a3594181a24415ee.pack, se describe en Documentation/technical/pack-format.txt y en Chapter 7.5 "The Packfile" de "Git Comunidad libro" (y mencionado en Chapter 9.4 "Packfiles" de "Pro Git")


Si usted quiere encontrar la última cometer, echar un primer vistazo a .git/HEAD archivo para encontrar rama actual. Sería contener algo como lo siguiente:

ref: refs/heads/master 

(si contiene SHA-1, puede tomarlo como id del último commit, y saltarse un paso). Luego revise, p. .git/refs/heads/master para encontrar a dónde apunta la ramificación. Contendría SHA-1 de una confirmación, p. Ej .:

dbc1b1f71052c084a84b5c395e1cb4b5ae526fcb 

La última (más reciente) confirmación probablemente estaría en formato suelto; en este ejemplo, estaría en el archivo .git/objects/db/c1b1f71052c084a84b5c395e1cb4b5ae526fcb.

8

Voy a interpretar su pregunta de una manera diferente. Si quiere entender qué son los archivos de los objetos, puede usar git para verlos directamente, sin navegar el registro del historial o usar git checkout, diff, etc.Por ejemplo:

para el archivo .git/objects/04/a42e9a7282340ef0256eaa6d59254227b8b141

Ejecutar el comando

git show 04a42e 

que combina la 04 de /04/ y los cuatro primeros caracteres del número restante a42e.

> git show 04a42e 
commit 04f7db976fa54c72fcc6350dd7d0aa06cb249df6 
Author: Alex Brown <[email protected]> 
Date: Fri Jan 8 11:02:21 2010 +0000 
a text file 

diff --git a/1.txt b/1.txt 
new file mode 100644 
index 0000000..04a42e9 
--- /dev/null 
+++ b/1.txt 
@@ -0,0 +1,3 @@ 
+Woo 
+# boo 
+# choo 

Esta es una confirmación, otros objetos pueden ser gotas de archivos, árboles, etc.

+0

Parece una buena respuesta a * alguna * pregunta: P –

12
alias deflate="perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)'" 

deflate .git/objects/4b/3083256dedabd68e839d7717aa785424119990 | sha1sum 
4b3083256dedabd68e839d7717aa785424119990 - 
0

El índice se almacena bajo .git/index.

Es un formato binario sin comprimir especificado en: https://github.com/git/git/blob/master/Documentation/technical/index-format.txt, por lo que la única forma de leerlo es con una herramienta como hd.

El archivo index contiene una lista de archivos con sus metadatos, incluidos el inode, los permisos y el tiempo de modificación. También contiene el SHA-1 del contenido, que se almacena como un objeto, lo que significa que cuando lo haces git add puede crear objetos nuevos.

Lo invito a crear un informe de prueba simple como git init init && cd init && echo a > a && git add a, y luego hd .git/index para verificar el formato campo por campo.

La siguiente pregunta se centra más en el índice: What does the git index contain EXACTLY?

Cuestiones relacionadas