Full Stack

Come inizializzare Git da riga di comando

Autore

Manuel Ricci

Per prima cosa abbiamo bisogno di un progetto sulla quale poter lavorare. Create una cartella dentro la quale poter lavorare. Mentre voi potete usare il linguaggio che preferite, io per poter essere il più agnostico possibile andrò di caro buon vecchio file di testo.

Anche la scelta del tool è a vostra discrezione, da qui in poi si può seguire usando solo il terminale o Visual Studio Code se vi trovate più comodi per certe operazioni come la creazione di file (mannaggia a Windows che non ha un comando touch).

Detto questo, una volta che siete nella vostra cartella di lavoro con terminale o, sempre da terminale, con Visual Studio Code potete eseguire il comando:

1$ git init

Git inizializzato da riga di comando

Nello screenshot sto usando Ubuntu con WSL, ma poco importa.

Vediamo quindi che il terminale risponde con:

1$ Initialized empty Git repository in /path/progetto/.git/

Bon, a posto, fine. Git è inizializzato fine della lezione. Ti piacerebbe…

Concedimi un po’ di teoria dopo tutta questa pratica.

Cos’è successo effettivamente con il comando che abbiamo eseguito? Beh, la risposta è chiara. Una repository Git vuota è stata inizializzata al percorso specificato.

La domanda che sorge spontanea è: cos’è quella cartella .git? Lo scopriamo subito.

Cos’è la directory .git e perché è nascosta?

Rispondo prima di tutto alla seconda domanda. Si tratta di una cartella troppo importante per lasciarla visibile con il rischio di cancellarla per sbaglio e seconda motivazione è che nella stragrande maggioranza dei casi non ci dovrai mai mettere le mani. Ma hey, questo è un corso, le mani ce le mettiamo eccome.

Contenuto della working directory dopo inizializzazione Git

Per visualizzare cartelle e file nascosti su Unix si usa il comando ls -la

Torniamo quindi alla prima domanda, cos’è la .git directory? È una cartella che contiene tutte le informazioni richieste per il controllo di versione.

Contenuto della cartella .git

Per entrare nella .git directory bisogna eseguire il comando cd .git e in seguito ls -la per elencare i file e le cartelle presenti al suo interno.

Post inizializzazione ha cinque sottocartelle (le voci in blu nel mio terminale):

  • hooks/
  • info/
  • objects/
  • refs/
  • branches/ Tre file (le voci in bianco nel mio terminale):
  • HEAD
  • config
  • description

La directory hooks

Contenuto della directory hooks

Eseguire il comando ls hooks per visualizzare il contenuto della directory hooks

La directory hooks contiene degli script per personalizzare i vari comandi di Git. Dopo l’inizializzazione sono presenti degli script di esempio, ma sono tutti disabilitati.

Per attivarli basta rimuovere il suffisso sample.

La directory info

Ulteriori informazioni sul repository sono registrate in questa directory, come: refs, grafts, exclude, attributes, sparse-checkout

Contenuto della directory info

Nella mia cartella info è presente solo il file exclude che ci permette di definire dei pattern di esclusione.

A livello di directory di lavoro usiamo il file .gitignore che viene usato da vari comandi di git come git status, git push, ecc. Ma i comandi core di Git usano questo file.

Su Windows non esiste il comando cat, ma potete usare type

Contenuto del file info da windows

La directory objects

Contiene tutti gli oggetti associati alla repository. In fase di inizializzazione contiene solo le directory pack e info, ma mano a mano che si faranno delle nuove commit si arricchirà di coppie di caratteri. Questi sono i primi due caratteri del hash SHA1 degli oggetti memorizzati e sono i nomi delle varie cartelle.

Contenuto directory objects

Dentro le cartelle troverete serie di 38 caratteri. Questi sono file, gli oggetti memorizzati in git. Sono cifrati per cui non c’è modo di vederne il contenuto direttamente.

Gli oggetti sono di tre tipologie:

  • tree (cartelle),
  • blob (file)
  • commit

La directory refs

refs contiene le referenze a tag, branch locali e remote.

  • tags per i tag
  • heads per le branch

Contenuto directory refs

Al momento entrambe le directory sono vuote, perché non abbiamo ancora creato branch o tag.

La directory branches

Un modo leggermente deprecato per memorizzare le abbreviazioni da usare per specificare un URL per git fetch, git pull e git push.

Il file HEAD

Il file contiene un riferimento alla branch corrente. Di default è main (o master).

Contenuto del file HEAD

Per Windows il comando è type e non cat, come si vede nello screenshot.

Il file config

Il file contiene la configurazione di Git a livello di progetto. Come già detto in precedenza sovrascrive gli altri due file di configurazione (nella cartella d’installazione e nella directory dell’utente).

Contenuto del file config

Nel mio caso vediamo quattro variabili:

  • respositoryformatversion
  • filemode
  • bare
  • logallrefupdates

Per i più curiosi ho linkato le reference, andate a darci una letta se volete.

Il file description

Ha un valore predefinito che è Unnamed repository; edit this file 'description' to name the repository. Viene usato da Git come metodo predefinito per conoscere il nome della repository.

Nello specifico può essere richiamato dagli hooks per, ad esempio, mandare una mail agli sviluppatori e usare il nome nel corpo della mail così da far capire di quale repo si tratta.

Valore predefinito del file description

Conclusioni

Questo è tutto quello che c’è da sapere sulla .git directory per il momento, ci torneremo in futuro per vedere com’è cambiata in seguito ai primi smanettamenti nella working directory e all’esecuzione di alcuni comandi, mentre nella parte più avanzata del corso vedremo anche come configurare gli hook, quindi è un arrivederci.

Caricamento...

Diventiamo amici di penna? ✒️

Iscriviti alla newsletter per ricevere una mail ogni paio di settimane con le ultime novità, gli ultimi approfondimenti e gli ultimi corsi gratuiti puubblicati. Ogni tanto potrei scrivere qualcosa di commerciale, ma solo se mi autorizzi, altrimenti non ti disturberò oltre.

Se non ti piace la newsletter ti ricordo la community su Discord, dove puoi chiedere aiuto, fare domande e condividere le tue esperienze (ma soprattutto scambiare due meme con me). Ti aspetto!

Ho in previsione di mandarti una newsletter ogni due settimane e una commerciale quando capita.