Da Anonimo (non verificato) , 29 Aprile 2026

Il modello subtree

Un subtree fonde la storia di un altro repository in una sottodirectory del proprio. A differenza dei submodule, non c'e un gitlink separato e nessun comando extra richiesto al clone — chi clona ottiene automaticamente i contenuti del subtree.

Aggiungere un subtree

git subtree add --prefix=third_party/lib \
  https://github.com/example/lib main --squash

Recuperare aggiornamenti

git subtree pull --prefix=third_party/lib \
  https://github.com/example/lib main --squash
git remote add lib https://github.com/example/lib
git subtree pull --prefix=third_party/lib lib main --squash

Push verso upstream

git subtree push --prefix=third_party/lib lib feature-branch

Subtree vs submodule

Scegliere subtree per un clone senza attriti, quando si modifica raramente il codice vendorizzato. Scegliere submodule per fissare uno SHA upstream esatto.

Estrarre una sottodirectory

git subtree split --prefix=third_party/lib -b lib-only
cd ..
git clone /path/to/parent --branch lib-only lib-extracted

Errori comuni

Dimenticare --squash importa decine di migliaia di commit upstream. Mescolare modifiche dentro al prefix con modifiche fuori nello stesso commit rende rumoroso subtree push.

Strategia merge subtree alternativa

git remote add -f lib https://github.com/example/lib
git merge -s ours --no-commit --allow-unrelated-histories lib/main
git read-tree --prefix=third_party/lib/ -u lib/main
git commit -m "Subtree merge of lib"