git init
Scopri l'importanza, l'utilizzo, la directory template e la configurazione del comando git init, e la differenza tra git init e git clone.
Cosa fa git init
git init crea un repository Git nuovo e vuoto — oppure reinizializza uno esistente. È quasi sempre il primissimo comando Git che esegui su un progetto, ed è ciò che trasforma una semplice cartella in qualcosa che Git può tracciare.
Eseguendolo si crea una singola sottodirectory nascosta chiamata .git all'interno del progetto. Quella directory contiene tutto ciò di cui Git ha bisogno per gestire la cronologia: il database degli oggetti, i riferimenti (branch e tag), il puntatore HEAD, la configurazione e una copia dei file del template predefinito. I file del progetto restano esattamente dove si trovano — Git non li sposta né li modifica durante l'init.
Questa pagina spiega come eseguire git init in modi diversi, la differenza tra un repository normale e uno bare, la directory template e l'elenco completo delle opzioni. Se invece vuoi una copia di un repository che già esiste altrove, ti serve git clone piuttosto che git init. Per una panoramica di livello superiore, consulta Cos'è Git.
Inizializzare un repository
Il modo più semplice per avviare il controllo di versione su un progetto è spostarsi nella sua directory con cd ed eseguire il comando senza argomenti:
cd my-project
git initGit stampa una conferma e crea la sottodirectory .git:
Initialized empty Git repository in /home/user/my-project/.git/Puoi anche passare un nome di directory. Git crea quella directory (se non esiste già) e vi posiziona il nuovo repository:
git init my-projectIl repository è vuoto a questo punto — non ci sono ancora commit. I passi successivi sono in genere fare lo staging dei file con git add e registrarli con git commit. Puoi controllare lo stato del nuovo repository in qualsiasi momento con git status.
Reinizializzare un repository esistente
Eseguire git init all'interno di una directory che ha già una sottodirectory .git è sicuro. Git non elimina né sovrascrive la cronologia o la configurazione — si limita a riapplicare eventuali file template mancanti e riporta:
Reinitialized existing Git repository in /home/user/my-project/.git/Questo è occasionalmente utile per acquisire nuovi file da una directory template aggiornata.
Repository bare
Un repository bare è quello creato con il flag --bare. Contiene la cronologia Git ma non ha una working directory — non ci sono file estratti da modificare, quindi non puoi fare commit direttamente su di esso.
git init --bare project.gitI repository bare esistono per essere un luogo centrale e condiviso verso cui altri cloni fanno push e da cui fanno pull. Fare push su un repository non-bare può sovrascrivere i file su cui qualcuno sta lavorando attivamente nella sua working directory, quindi i repository centrali/remoti sono quasi sempre bare. Per convenzione vengono denominati con il suffisso .git (ad esempio project.git).
La differenza è visibile nella struttura. Un repository normale nasconde i file di Git all'interno di una cartella .git:
my-project/
├── .git/ ← Git's data lives here
└── (your files)Un repository bare mette lo stesso contenuto direttamente al primo livello — non c'è un albero di lavoro che lo avvolge:
project.git/
├── HEAD
├── config
├── description
├── hooks/
├── info/
├── objects/
└── refs/
Impostare il nome del branch iniziale
Storicamente Git chiamava il primo branch master. Puoi scegliere un nome diverso al momento dell'init con --initial-branch (o nella sua forma breve -b):
git init --initial-branch=mainPer renderlo il predefinito per ogni nuovo repository senza dover passare il flag ogni volta, impostalo una volta nella configurazione globale:
git config --global init.defaultBranch mainConsulta git config per ulteriori informazioni sulle impostazioni globali.
La directory template
Quando Git crea la sottodirectory .git, la popola da una directory template — un insieme di file (come hook di esempio e un file info/exclude) che vengono copiati in ogni nuovo repository. Git sceglie il template da utilizzare dal primo di questi che è impostato, nell'ordine:
- il percorso specificato con l'opzione
--template, - la variabile d'ambiente
$GIT_TEMPLATE_DIR, - la variabile di configurazione
init.templateDir, - il predefinito integrato, di solito
/usr/share/git-core/templates.
I template predefiniti servono principalmente come esempi (ad esempio, gli hook di esempio sono disabilitati per impostazione predefinita). Fornendo una propria directory template puoi fare in modo che file e cartelle — come un insieme standard di hook — vengano copiati automaticamente in ogni repository che inizializzi.
Riferimento alle opzioni
git init accetta un argomento <directory> opzionale. Se lo ometti, il comando viene eseguito nella directory corrente; se fornisci un percorso che non esiste, Git lo crea. I flag più utili sono elencati di seguito.
| Flag | Descrizione |
|---|---|
-q, --quiet | Stampa solo errori e avvisi; tutto l'altro output viene soppresso. |
--bare | Crea un repository bare (senza working directory). |
--template=<template-directory> | Specifica la directory template da cui copiare i file durante la creazione del repository. |
--separate-git-dir=<git-dir> | Salva i dati Git effettivi in <git-dir> e lascia un piccolo file di testo .git che punta ad esso. Su un repository esistente, la directory .git viene spostata nel nuovo percorso. |
--shared[=(false|true|umask|group|all|world|everybody|0xxx)] | Configura il repository per essere condiviso tra più utenti, controllando i permessi dei file di gruppo. |
-b <name>, --initial-branch=<name> | Imposta il nome del branch iniziale nel nuovo repository. |
git init vs. git clone
Entrambi i comandi creano un repository locale, ma partono da punti opposti:
git inittrasforma una cartella locale esistente in un repository nuovo e vuoto senza cronologia.git clonescarica un repository remoto esistente — con tutta la sua cronologia, i branch e i file — e imposta una connessione verso quel remote.
Usa git init quando stai avviando un progetto da zero sulla tua macchina; usa git clone quando stai aderendo a un progetto che già risiede su un server come GitHub.