Sinossi
git subtree add --prefix=<path> <repo> <ref> [--squash]
git subtree pull --prefix=<path> <repo> <ref>
git subtree push --prefix=<path> <repo> <ref>
git subtree split --prefix=<path> -b <new-branch>
Descrizione
Il comando git subtree è un'alternativa ai submodule che mergia il contenuto di un altro progetto direttamente in una sottodirectory del tuo repo. A differenza dei submodule, i consumatori di subtree non hanno bisogno di passi speciali — i file sono semplicemente lì. Il costo è che la storia esterna viene incorporata nella tua.
Le due operazioni principali sono add (importazione iniziale, spesso con --squash per appiattire la storia) e pull (porta dentro le modifiche upstream). Per mandare indietro le modifiche, git subtree push filtra i commit che toccano il prefisso e li pusha al repo upstream.
Nell'uso quotidiano, git subtree si integra con alias e CI.
Capire il modello dati di Git aiuta a prevedere i risultati.
Opzioni comuni
| Sottocomando | Descrizione |
|---|---|
add | Importa un repo esterno in una sottodirectory. |
pull | Mergia modifiche upstream per quel prefisso. |
push | Pusha la storia solo del prefisso indietro upstream. |
merge | Mergia un tree arbitrario nel prefisso. |
split | Estrae la storia di una sottodirectory come branch standalone. |
--squash | Appiattisce la storia esterna in un singolo commit. |
--prefix=<path> | Sottodirectory sotto cui mettere il subtree. |
Esempi
git subtree add --prefix=vendor/foo https://github.com/lib/foo.git main --squash
# Importa foo in vendor/foo, squashando la storia
git subtree pull --prefix=vendor/foo https://github.com/lib/foo.git main --squash
# Pull degli aggiornamenti
git subtree split --prefix=lib -b lib-only
# Estrae lib/ come proprio branch per la condivisione
git subtree push --prefix=vendor/foo upstream main
# Manda commit limitati al prefisso indietro all'upstream
Errori comuni
Mescolare --squash su alcune operazioni e non altre crea storia disordinata. Scegli una modalità e attieniti ad essa. I merge subtree producono grafi di commit non triviali che confondono alcuni strumenti. git subtree split può essere lento su storie grandi.
Comandi correlati
git submodule, git merge, git filter-repo