2009-10-07 12 views
15

Utilizzo del terminale OS X,Come visualizzare oggetti git e indice senza utilizzare git

Come si visualizzano i contenuti di questi file come testo normale?

+0

Questi file non sono intrinsecamente testo normale, e di vederle come tale, è necessario un programma che li converte dal formato in testo. Git è un programma con componenti progettati per fare esattamente questo. Sarei estremamente sorpreso se qualcuno ne avesse scritto un altro. – Cascabel

+0

Quindi gli oggetti (in particolare gli oggetti commit) non verranno convertiti in testo normale? –

+0

Sono * compressi * almeno * usando la compressione zlib (deflate). –

risposta

9

Vedere “Object storage format” in Git User Manual.

Si tratta di dati compressi non elaborati utilizzando zlib. Si può usare zpipe dal pacchetto 'zlib1g-dev'. Compilare the example con gcc -o zpipe zpipe.c -lz. Non è uno standard .gz o qualcosa del genere.

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

stampa il contenuto del blob (intestazione + dati)

Se si desidera controllare l'SHA-1, si deve mettere il blob non compresso in un file (myblob) e fare

sha1sum myblob 
+0

Sfortunatamente, questo non funziona per gli oggetti imballati (quelli che sono nel repository da un po 'di tempo). –

+1

Vuoi dire che i file oggetto contengono solo il payload DEFLATE, e non altri campi di metadati come specificato in: https://www.ietf.org/rfc/rfc1952.txt, quindi questo è il motivo per cui 'gunzip' non funzionerà ? –

10

Se si desidera visualizzare la forma di testo normale di oggetti git (commit e/o blob, ovvero il contenuto del file) senza utilizzando git, non sarebbe facile, specialmente se il repository è pieno. Non puoi installare git localmente, nella tua home directory (o il suo equivalente su MacOS X)?

Il formato per oggetti allentati, memorizzati come file nella directory fan-out .git/objects/, ad es. .git/objects/02/43019ddb4d94114e5a8580eec01baeea195133 (la directory fan-out e il nome file formano l'identificatore SHA-1 dell'oggetto), è descritta ad es. in Chapter 9.2 "Git Objects" del libro "Pro Git" (disponibile on-line gratuitamente) e Chapter 7.1 "How Git Stores Objects" di "Git Community Book".

Il formato pacchetto, in cui il set di oggetti è memorizzato in un singolo file in .git/objects/pack/, ad es. .git/objects/pack/pack-1db7aa96d95149a4dd341490a3594181a24415ee.pack, è descritto in Documentation/technical/pack-format.txt e in Chapter 7.5 "The Packfile" di "Git Community Book" (ed è riportata nel Chapter 9.4 "Packfiles" di "Pro Git")


Se si vuole trovare ultima commit, date un'occhiata prima a .git/HEAD file da trovare filiale attuale. Esso dovrebbe contenere qualcosa di simile al seguente:

ref: refs/heads/master 

(se contiene SHA-1, si può prendere come id dell'ultimo commit, e saltare un passaggio). Quindi controlla ad es. .git/refs/heads/master per trovare dove punta il ramo. Contiene SHA-1 di un commit, ad esempio

dbc1b1f71052c084a84b5c395e1cb4b5ae526fcb 

L'ultimo (più recente) commit sarebbe probabilmente in formato libero; in questo esempio sarebbe nel file .git/objects/db/c1b1f71052c084a84b5c395e1cb4b5ae526fcb.

8

Ho intenzione di interpretare la tua domanda in un modo diverso. Se vuoi capire quali sono i file degli oggetti, puoi usare git per visualizzarli direttamente, senza navigare nel log della cronologia o usando git checkout, diff ecc.Per esempio:

Per il file .git/objects/04/a42e9a7282340ef0256eaa6d59254227b8b141

Eseguire il comando

git show 04a42e 

che unisce la 04 da /04/ ed i primi quattro caratteri del restante numero di 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 

Questo è un commit, altri oggetti possono essere macchie di file, alberi, ecc

+0

Questa sembra una buona risposta a * alcune * domande: P –

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

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

L'indice viene memorizzato in .git/index.

È un formato non compresso binario specificato a: https://github.com/git/git/blob/master/Documentation/technical/index-format.txt, quindi l'unico modo per leggerlo è con uno strumento come hd.

Il file index contiene un elenco di file con i relativi metadati, inclusi inode, autorizzazioni e ora di modifica. Contiene anche SHA-1 del contenuto, che viene memorizzato come oggetto, il che significa che quando si esegue git add può creare nuovi oggetti.

Vi incoraggio a creare un semplice repository di test come git init init && cd init && echo a > a && git add a e quindi hd .git/index per verificare il formato campo per campo.

La domanda si concentra più sull'indice: What does the git index contain EXACTLY?

Problemi correlati