In genere creo tutti i miei progetti con un repository GIT dietro. Quando, però, si tratta poi di linkare o rilasciare il progetto vorrei un archivio compresso ZIP in modo che tutto sia il più leggero e piccolo possibile. GIT fornisce diversi metodi per raggiungere tale scopo. Se si dispone di un repo GIT con numerose modifiche e possibili binari allora si potrebbe avere una cartella che sia molto più grande dell’essenziale.
I tuo clienti non si preoccupano della storia di come questo progetto sia cresciuto, ma vogliono solo l’ultima versione di tutti i file. Questo esempio contiene un’immagine JPEG peso di 9 MB, per un totale di 23.2 MB, ma 23.2 MB è ancora più del doppio della dimensione necessaria. Ancora più divertente: se si tenta di comprimere l’intera cartella, si aggiunge anche tutta la roba git nascosta producendo un archivio ZIP con ben 22.2 MB!
Il comando per produrre una “fotografia” zip di un ramo specifico è costruito in GIT stesso, eh chi lo sapeva!
Sinossi
[code lang=”bash”]
git archive [–format=<fmt>] [–list] [–prefix=<prefix>/] [<extra>]
[-o <file> | –output=<file>] [–worktree-attributes]
[–remote=<repo> [–exec=<git-upload-archive>]] <tree-ish>
[<path>…]
[/code]
Descrizione
Archive crea un archivio del formato specificato che contiene la struttura ad albero, e lo scrive fuori sullo standard output. Se —prefix viene specificato è la stringa che verrà anteposta ai nomi dei file in archivio.
Git archive si comporta diversamente quando dato un ID di albero rispetto a quando dato un ID di commit o tag. Nel primo caso l’ora corrente viene utilizzata come la data di modifica di ogni file nell’archivio. In quest’ultimo caso l’orario come registrato nell’oggetto di riferimento commit viene usato al posto commit. Inoltre l’ID del commit è memorizzato in un’intestazione globale estesa se viene utilizzato il formato tar; può essere estratto usando git get-tar-commit-id. Nei file ZIP viene memorizzato come il commento del file.
Senza il parametro –output l’archivio viene fuori sul terminale, che non è molto utile. Quindi specifichiamo il nome del file di output.
Il comando archive supporta diversi formati per l’archiviazione, mostrati dall’ opzione –list.
- tar
- tgz
- tar.gz
- zip
Naturalmente vogliamo usare zip, non ci sentiamo come il geek Unix di oggi che deve tar.gz-are tutto. Se non si specifica un formato, ma specifica il file di output git indovina il formato dal nome del file. Senza un estensione del file che ricade tar.
Così il comando minimale è:
[code lang=”bash”]git archive -o master.zip -9 HEAD[/code]
Invece di HEAD è possibile utilizzare anche altri indicatori di commit, come master o un SHA di commit, master.zip ovviamente è il nome + path del file compresso, mentre -9 è il livello di compressione (da 0 a 9). Il risultato è molto più piccolo dei 23 MB con cui abbiamo iniziato:
Conclusione
Il comando git archive consente di produrre un file ZIP che contiene solo una versione specifica della repo. Molto pratico davvero.