Das Subtree-Modell
Ein Subtree fugt die Historie eines anderen Repositorys in ein Unterverzeichnis Ihres ein. Anders als Submodule gibt es keinen separaten Gitlink und keine zusatzlichen Befehle beim Klonen.
Subtree hinzufugen
git subtree add --prefix=third_party/lib \
https://github.com/example/lib main --squash
Updates ziehen
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 zuruck zu upstream
git subtree push --prefix=third_party/lib lib feature-branch
Subtree vs Submodul
Subtrees fur reibungsloses Klonen, wenn Sie selten den vendored Code andern. Submodule, wenn Sie auf einen genauen upstream-SHA pinnen mussen.
Unterverzeichnis aufteilen
git subtree split --prefix=third_party/lib -b lib-only
cd ..
git clone /path/to/parent --branch lib-only lib-extracted
Haufige Fehler
--squash vergessen importiert zehntausende upstream-Commits.
Alternative Subtree-Merge-Strategie
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"