Introduzione
git clone copia un repository remoto sulla tua macchina. Crea una nuova directory, inizializza .git al suo interno, scarica tutti gli oggetti e i ref, configura un remote chiamato origin e fa il checkout del branch predefinito. Dopo il clone hai un repository completo e indipendente.
Clone di base
git clone https://github.com/torvalds/linux.git
cd linux
git remote -v
# origin https://github.com/torvalds/linux.git (fetch)
# origin https://github.com/torvalds/linux.git (push)
Scegliere un nome di directory
Per impostazione predefinita Git usa l'ultimo componente del path. Sovrascrivilo:
git clone https://github.com/example/widget.git my-widget
Scegliere un protocollo
- HTTPS: il più semplice, funziona attraverso i firewall, spesso richiede un credential helper o token.
- SSH: comodo con autenticazione a chiave, veloce per utenti esperti.
- git://: anonimo, non autenticato, perlopiù storico.
- file:// o path locale: clone da un'altra directory.
git clone [email protected]:example/widget.git
git clone /srv/git/widget.git
git clone file:///srv/git/widget.git
Opzioni utili
git clone --depth 1 <url> # shallow: solo la punta
git clone --branch v1.2.3 <url> # checkout di un branch o tag specifico
git clone --single-branch <url> # scarica solo un branch
git clone --bare <url> # clone bare, senza working tree
git clone --recurse-submodules <url>
I clone shallow risparmiano banda per la CI; converti dopo con git fetch --unshallow.
Cosa fa clone, passo per passo
- Crea la directory di destinazione.
- Esegue
git inital suo interno. - Aggiunge
origincome remote. - Esegue
git fetch origin. - Configura il tracking per il branch predefinito.
- Esegue
git checkoutper quel branch.
Sparse e partial clone per repo enormi
I repository che si estendono per gigabyte (sistemi operativi, monorepo) sono dolorosi da clonare in toto. Due funzionalità complementari aiutano:
git clone --filter=blob:none --no-checkout <url> repo
cd repo
git sparse-checkout init --cone
git sparse-checkout set src/myteam
git checkout main
--filter=blob:none rimanda il download dei blob finché non sono necessari, mentre sparse-checkout popola solo le directory che elenchi. Insieme ti permettono di lavorare su una piccola fetta di un repo enorme con costi proporzionali di disco e banda.
Hook al momento del clone
Alcuni progetti includono passi di setup che dovrebbero girare al clone (installazione di pre-commit hook, fetch di oggetti LFS, inizializzazione di submodule). Git non esegue hook al clone, ma puoi concatenarli:
git clone --recurse-submodules <url> repo
cd repo
git lfs install
pre-commit install
Per i nuovi contributori, documenta questa sequenza in CONTRIBUTING.md o avvolgila in uno script scripts/bootstrap. I progetti intelligenti rendono il loro target make setup idempotente in modo che ri-eseguirlo dopo un clone stantio sia sicuro.
Errori comuni
Clonare in una directory non vuota: Git rifiuta a meno che non passi un target esplicitamente vuoto. Clonare repository enormi senza --depth su connessioni lente, poi rinunciare a metà strada. Clonare via HTTPS verso un server che richiede SSO, poi non poter fare push perché il tuo token manca dello scope giusto. Testa sempre con git push --dry-run dopo il primo commit. Infine, clonare in ~/Desktop o un'altra cartella di sync (Dropbox, iCloud, OneDrive) porta a corruzione quando il client di sync scrive a metà .git/index. Tieni i clone di lavoro su storage locale semplice.