2009-10-07 7 views
15

Utilisation du terminal OS X,Comment afficher les objets git et l'index sans utiliser git

Comment visualiser le contenu de ces fichiers en texte brut?

+0

Ces fichiers sont intrinsèquement non-texte brut, et de les afficher en tant que tel, vous avez besoin d'un programme qui les convertit de leur format en texte. Git est un programme avec des composants conçus pour faire exactement cela. Je serais extrêmement surpris si quelqu'un en a écrit un autre. – Cascabel

+0

Donc les objets (en particulier les objets commit) ne seront pas convertis en texte brut? –

+0

Ils sont * au moins * compressés en utilisant la compression zlib (deflate). –

Répondre

9

Regardez “Object storage format” in Git User Manual.

Il s'agit de données compressées brutes utilisant zlib. On peut utiliser zpipe depuis le paquet 'zlib1g-dev'. Compilez the example avec gcc -o zpipe zpipe.c -lz. Ce n'est pas une norme .gz ou quelque chose.

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

imprime le contenu du blob (en-tête + données)

Si vous voulez vérifier le SHA-1, vous devez mettre le blob non compressé dans un fichier (myblob) et faire

sha1sum myblob 
+0

Malheureusement, cela ne fonctionne pas pour les objets emballés (ceux qui ont été dans le référentiel pendant un certain temps). –

+1

Voulez-vous dire que les fichiers objets contiennent uniquement la charge utile DEFLATE, et non les autres champs de métadonnées spécifiés dans: https://www.ietf.org/rfc/rfc1952.txt, c'est pourquoi 'gunzip' ne fonctionnera pas ? –

10

Si vous souhaitez afficher la forme en texte brut des objets git (validés et/ou blobs, c'est-à-dire le contenu du fichier) sans utiliser en utilisant git, ce ne serait pas facile, surtout si le référentiel est compressé. Vous ne pouvez pas installer git localement, dans votre répertoire personnel (ou son équivalent sur MacOS X)?

Le format pour lâche objets, stockés en tant que fichiers dans .git/objects/ répertoire fan-out, par ex. .git/objects/02/43019ddb4d94114e5a8580eec01baeea195133 (le répertoire de fan-out et l'identifiant SHA-1 de l'objet) est décrit par ex. en Chapter 9.2 "Git Objects" du livre "Pro Git" (disponible en ligne gratuitement) et Chapter 7.1 "How Git Stores Objects" de "Git Community Book".

Le format pack, où l'ensemble d'objets est stocké dans un fichier unique dans .git/objects/pack/, par ex. .git/objects/pack/pack-1db7aa96d95149a4dd341490a3594181a24415ee.pack, est décrit dans Documentation/technical/pack-format.txt et Chapter 7.5 "The Packfile" de « Git Community Book » (et mentionné dans Chapter 9.4 "Packfiles" de « Git Pro »)


Si vous voulez trouver le dernier COMMIT jeter un premier regard sur .git/HEAD fichier à trouver branche actuelle. Il contiendrait quelque chose comme ce qui suit:

ref: refs/heads/master 

(si elle contient SHA-1, vous pouvez le prendre comme id dernier commit, et sauter une étape). Puis vérifiez par ex. .git/refs/heads/master pour trouver où pointe la branche. Il contiendrait SHA-1 d'un commit, par exemple:

dbc1b1f71052c084a84b5c395e1cb4b5ae526fcb 

Le dernier commit (le plus récent) serait probablement en format lâche; dans cet exemple, il s'agirait du fichier .git/objects/db/c1b1f71052c084a84b5c395e1cb4b5ae526fcb.

8

Je vais interpréter votre question d'une manière différente. Si vous voulez comprendre ce que sont les fichiers objets, vous pouvez utiliser git pour les voir directement, sans naviguer dans le journal de l'historique ou en utilisant git checkout, diff etc.Par exemple:

Pour le fichier .git/objects/04/a42e9a7282340ef0256eaa6d59254227b8b141

Exécutez la commande

git show 04a42e 

qui combine la 04 de /04/ et les quatre premiers caractères du nombre restant 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 

Celui-ci est une livraison, d'autres objets peuvent être fichiers blobs, arbres, etc.

+0

Cela semble être une bonne réponse à * certaines * questions: P –

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

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

L'index est enregistré sous .git/index.

Il s'agit d'un format binaire non compressé spécifié à l'adresse: https://github.com/git/git/blob/master/Documentation/technical/index-format.txt, la seule façon de le lire est donc d'utiliser un outil tel que hd.

Le fichier index contient une liste de fichiers avec leurs métadonnées, y compris les inodes, les autorisations et l'heure de modification. Il contient également le SHA-1 du contenu, qui est stocké en tant qu'objet, ce qui signifie que lorsque vous faites git add il peut créer de nouveaux objets.

Je vous encourage à créer un rapport de test simple comme git init init && cd init && echo a > a && git add a, puis hd .git/index pour vérifier le format de champ par champ.

La question suivante se concentre davantage sur l'indice: What does the git index contain EXACTLY?

Questions connexes