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?
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?
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
Sfortunatamente, questo non funziona per gli oggetti imballati (quelli che sono nel repository da un po 'di tempo). –
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à ? –
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
.
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
Questa sembra una buona risposta a * alcune * domande: P –
alias deflate="perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)'"
deflate .git/objects/4b/3083256dedabd68e839d7717aa785424119990 | sha1sum
4b3083256dedabd68e839d7717aa785424119990 -
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?
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
Quindi gli oggetti (in particolare gli oggetti commit) non verranno convertiti in testo normale? –
Sono * compressi * almeno * usando la compressione zlib (deflate). –