Basic git subtrees

January 21, 2022

Condensed notes on how to use git subtrees to vendor in source code.

Basics (add, pull, push)

Pull in a new repository to dir/:

$ git subtree add --prefix dir/ REMOTE REMOTE-BRANCH --squash

The squash flag can be elided if the subtrees history is wanted.

To pull in updates:

$ git subtree pull --prefix dir/ REMOTE REMOTE-BRANCH --squash

If changes need to be pushed back upstream

$ git subtree push --prefix dir/ REMOTE REMOTE-BRANCH --squash

A git subtree is just a folder, so can be removed with rm.

Splitting off a subtree

Split off a directory's commits in a separate branch

$ git subtree split -P dir/ -b NEW-BRANCH-NAME

This can then be pushed to the remote:

$ git push -u REMOTE NEW-BRANCH-NAME:REMOTE-BRANCH

The old directory can be left in place, and the subtree pull commands can be used as per-normal.