git clone: come clonare un repository da GitHub e non solo
git clone scarica l'intero repository remoto (tutti i file, tutta la storia dei commit e i branch) e crea una copia locale con il remote origin già configurato. La chiamata base è git clone indirizzo-repository. Le opzioni permettono di scegliere la cartella, il branch o di scaricare solo gli ultimi commit con --depth 1.
Il comando git clone crea una copia locale completa di un repository remoto: file, tutta la storia dei commit, branch e tag. È il modo standard per iniziare a lavorare su un progetto che si trova già su GitHub, GitLab o un server aziendale. A differenza del download di un archivio ZIP, il clone è un repository a tutti gli effetti, in cui si può fare commit e inviare le modifiche indietro.
Uso base di git clone
Copiate l'indirizzo del repository (su GitHub è il pulsante verde «Code») ed eseguite:
git clone https://github.com/username/project.git
Cloning into 'project'...
remote: Enumerating objects: 1532, done.
remote: Counting objects: 100% (1532/1532), done.
remote: Compressing objects: 100% (812/812), done.
Receiving objects: 100% (1532/1532), 2.41 MiB | 6.10 MiB/s, done.
Resolving deltas: 100% (701/701), done.
Git crea la cartella project nella directory corrente (il nome viene preso dall'indirizzo senza .git). Poi entrateci:
cd project
git status
Cosa fa git clone dietro le quinte
Clonare non significa solo scaricare file. Capire questi passaggi spiega perché dopo il clone tutto «funziona e basta» e da dove arrivano i branch con il prefisso origin/. Passo per passo, il comando:
- crea la cartella ed esegue al suo interno l'equivalente di
git init; - aggiunge un remote chiamato
originche punta all'indirizzo di origine; - scarica tutti gli oggetti e i riferimenti, l'equivalente di
git fetch; - crea i branch remoti
origin/main,origin/develope così via; - crea il branch locale predefinito (di solito
main), lo collega aorigin/mained estrae i file.
Per questo dopo il clone non serve configurare a mano git remote: git push e git pull funzionano subito.
git remote -v
origin https://github.com/username/project.git (fetch)
origin https://github.com/username/project.git (push)
Clonare via HTTPS e via SSH
| HTTPS | SSH | |
|---|---|---|
| Indirizzo | https://github.com/user/repo.git | git@github.com:user/repo.git |
| Repository pubblico | Si clona senza autenticazione | Serve una chiave SSH aggiunta all'account |
| Repository privato, push | Serve un Personal Access Token al posto della password | Funziona con la chiave, senza digitare password |
| Reti aziendali | La porta 443 è quasi sempre aperta | La porta 22 a volte è chiusa |
Per leggere progetti open source altrui basta HTTPS. Per i vostri repository, su cui fate push regolarmente, è più comodo SSH:
git clone git@github.com:username/project.git
Se avete già clonato via HTTPS e volete passare a SSH, non serve riscaricare nulla:
git remote set-url origin git@github.com:username/project.git
Come clonare in una cartella specifica
Il secondo argomento è il nome o il percorso della directory di destinazione:
# In una cartella con un nome diverso
git clone https://github.com/username/project.git my-copy
# Nella cartella corrente (deve essere vuota)
git clone https://github.com/username/project.git .
Se la cartella di destinazione esiste e non è vuota, Git rifiuta: fatal: destination path 'project' already exists and is not an empty directory.
Come clonare un branch specifico
Di default dopo il clone vi trovate sul branch predefinito del repository remoto. Per finire subito su un altro, usate -b (--branch):
git clone -b develop https://github.com/username/project.git
Attenzione: in questo modo vengono scaricati tutti i branch, semplicemente vi ritroverete su develop. Se vi serve un solo branch senza gli altri, aggiungete --single-branch:
git clone -b develop --single-branch https://github.com/username/project.git
L'opzione -b accetta anche il nome di un tag: otterrete lo stato del progetto al momento della release (in modalità detached HEAD):
git clone -b v2.1.0 --depth 1 https://github.com/username/project.git
Dove sono gli altri branch dopo il clone
Chi inizia si stupisce: git branch mostra solo main. Gli altri branch sono scaricati come remoti e si vedono così:
git branch -a
* main
remotes/origin/HEAD -> origin/main
remotes/origin/develop
remotes/origin/feature/login
Per iniziare a lavorare su uno di essi basta spostarsi usando il nome breve: Git crea da solo un branch locale che traccia quello remoto:
git switch develop
Clone superficiale: --depth per i repository grandi
Nei progetti di lunga data la storia può pesare gigabyte. Se vi serve solo il codice attuale, ad esempio nella CI o solo per compilare il progetto, scaricate gli ultimi commit:
git clone --depth 1 https://github.com/username/big-project.git
L'opzione --depth implica --single-branch, quindi arrivano solo il branch predefinito e un commit. Se più avanti vi servirà la storia completa, potete scaricarla:
git fetch --unshallow
Si può indicare anche un'altra profondità, ad esempio --depth 50, o limitare la storia per data con --shallow-since=2025-01-01. Per lo sviluppo attivo il clone superficiale è scomodo: git log, git blame e la ricerca nella storia saranno incompleti.
Clone parziale: --filter
Un'alternativa per monorepo enormi è scaricare la storia dei commit e caricare il contenuto dei file su richiesta:
git clone --filter=blob:none https://github.com/username/monorepo.git
Così conservate la storia completa per log e per il cambio di branch, ma risparmiate traffico e spazio. Richiede il supporto del server; GitHub e GitLab lo offrono.
Clone mirror e migrazione di un repository
Un clone normale prende i branch come remoti e non copia i riferimenti di servizio del server. Per spostare un progetto su un altro hosting o creare una copia di backup identica si usa --mirror:
git clone --mirror https://github.com/username/project.git
cd project.git
git push --mirror git@gitlab.com:username/project.git
Il mirror è un repository bare senza file di lavoro, in cui tutti i branch e i tag sono conservati come locali. Il comando git push --mirror li invia al nuovo server per intero, e la storia viene trasferita senza perdite. Tenete presente che issue, pull request e impostazioni dell'hosting non vengono trasferite così: sono dati del servizio, non di Git.
L'opzione simile --bare crea anch'essa un repository senza working directory, ma copia solo branch e tag. È adatta per creare un repository centrale sul proprio server a partire da un progetto esistente.
Clonare con i submodule
Se il progetto usa i git submodule, di default le loro cartelle risulteranno vuote. Per scaricare tutto subito:
git clone --recurse-submodules https://github.com/username/project.git
Se avete già clonato senza l'opzione, scaricate i submodule:
git submodule update --init --recursive
git clone, fork e download dello ZIP
| Metodo | Cosa ottenete | Quando usarlo |
|---|---|---|
git clone | Il repository completo con storia e remote | Lavorare su un progetto in cui avete i permessi o vi serve la storia |
| Fork su GitHub | Una copia del repository nel vostro account sul server | Contribuire al progetto di qualcun altro tramite pull request |
| Download ZIP | Solo i file, senza .git | Dare un'occhiata veloce al codice, senza intenzione di fare commit |
Fork e clone non sono in competizione: nell'open source prima si fa il fork sul sito, poi si clona il proprio fork e si aggiunge l'originale come secondo remote:
git clone git@github.com:me/project.git
cd project
git remote add upstream https://github.com/author/project.git
git fetch upstream
Errori frequenti di git clone
«Repository not found»
Un refuso nell'indirizzo, oppure il repository è privato e non avete accesso. Per i repository privati GitHub risponde di proposito «not found» e non «accesso negato». Controllate l'indirizzo e di essere autenticati con l'account giusto.
«Permission denied (publickey)»
Clone via SSH, ma la chiave non è configurata. Verificate con ssh -T git@github.com, aggiungete la chiave pubblica nelle impostazioni dell'account o clonate temporaneamente via HTTPS.
«Authentication failed» via HTTPS
Avete inserito la password dell'account. GitHub da tempo richiede un Personal Access Token al posto della password per le operazioni Git via HTTPS. Se Git ha memorizzato credenziali sbagliate, eliminatele dal gestore delle credenziali del sistema.
Interruzione su un repository grande
Errori come early EOF o RPC failed sono spesso legati a una rete instabile e alle dimensioni. Aiuta un clone superficiale --depth 1 seguito da git fetch --unshallow, oppure un clone via SSH.
Problemi con i fine riga su Windows
Dopo il clone tutti i file risultano «modificati»: è l'effetto della conversione CRLF/LF. Impostate git config --global core.autocrlf true su Windows (o input su Linux e macOS) e, meglio ancora, definite le regole nel .gitattributes del progetto.
Cosa fare subito dopo il clone
Il clone è pronto, ma prima di modificare il codice conviene dedicare un paio di minuti alla preparazione. Vi eviterà i problemi tipici del primo giorno su un progetto altrui.
- Leggete README e CONTRIBUTING. Di solito spiegano come installare le dipendenze, lanciare i test e come si chiamano i branch nel progetto.
- Controllate branch e stato.
git statusegit log --oneline -5mostrano dove siete e quali sono le ultime modifiche. - Create un vostro branch. Non lavorate direttamente su
main:git switch -c feature/my-task. - Verificate l'autore dei commit. Se sul computer avete più account (personale e di lavoro), impostate l'e-mail per il singolo repository senza
--global:git config user.email "you@company.com". - Installate le dipendenze. Cartelle come
node_modulesovenvnon si mettono nel repository, si creano in locale:npm install,pip install -r requirements.txte così via.
Come tenere aggiornato il clone
Il clone si fa una volta sola. Dopo, i nuovi commit dei colleghi si scaricano dallo stesso origin:
# Vedere cosa è arrivato sul server senza modificare nulla
git fetch
git log --oneline main..origin/main
# Integrare le modifiche nel branch corrente
git pull
L'abitudine di fare prima git fetch e guardare cosa è arrivato evita conflitti a sorpresa. Non serve clonare di nuovo il progetto «per aggiornarlo»: così si perdono i branch locali e il lavoro non committato.
Promemoria su git clone
| Operazione | Comando |
|---|---|
| Clone normale | git clone <url> |
| In una cartella a scelta | git clone <url> <cartella> |
| Subito sul branch voluto | git clone -b <branch> <url> |
| Un solo branch | git clone -b <branch> --single-branch <url> |
| Senza storia | git clone --depth 1 <url> |
| Senza il contenuto dei file vecchi | git clone --filter=blob:none <url> |
| Con i submodule | git clone --recurse-submodules <url> |
| Copia bare per un server | git clone --bare <url> |
In sintesi
git clone scarica l'intero repository e configura subito il collegamento con il server tramite origin, quindi dopo si può fare commit, push e pull senza altre configurazioni. Per i vostri progetti usate SSH, per quelli grandi --depth o --filter, per un branch specifico -b. Il lavoro con i repository remoti, push, pull e fetch sono trattati in pratica nel corso su Git.
Domande frequenti
Che differenza c'è tra git clone e git pull?
git clone si esegue una volta e crea una nuova copia locale del repository. git pull si esegue in un clone già esistente e scarica le nuove modifiche dal server.
Si può clonare solo una cartella di un repository?
Non direttamente. La soluzione più vicina è un clone parziale con --filter=blob:none --sparse seguito da git sparse-checkout set percorso: nella working directory comparirà solo la cartella che vi serve.
Quanto spazio occupa un clone?
Circa la dimensione dell'intera storia in forma compressa più i file estratti della versione corrente. La dimensione del repository si vede con il comando git count-objects -vH.
Si può clonare un repository locale?
Sì, indicate un percorso al posto dell'indirizzo: git clone /path/to/repo copy. È comodo per fare esperimenti senza rischiare la copia principale.
Bisogna fare git init prima di git clone?
No. git clone crea da solo la cartella e inizializza al suo interno il repository.
Questo argomento è trattato in modo approfondito, con pratica, nel corso «Git da zero a sviluppatore sicuro».
Vai al corso