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"