I've just found git-subtree tool that some time ago became a part of main git repo https://github.com/apenwarr/git-subtree/
However I don't fully understand what functionality does this tool provide over the already existing "git read-tree" + "git merge -s subtree". Is the only purpouse of git-subtree - making the resultant commit history look better or does it have more functionality that I've overlooked?
About subtree merges Typically, a subtree merge is used to contain a repository within a repository. The "subrepository" is stored in a folder of the main repository.
git subtree lets you nest one repository inside another as a sub-directory. It is one of several ways Git projects can manage project dependencies. Why you may want to consider git subtree. Management of a simple workflow is easy.
Component-based development favors Git submodules, whereas system-based development favors Git subtrees. Git submodules have a smaller repository size since they are just links to a single commit in a subproject; whereas Git subtrees store the whole subproject, including its history.
Use git subtree split to extract the files you want to the an intermediate branch in your repository (you have already done this).
The commands you describe reads a subtree into a repository. The git-subtree
command has many more options, as described by the documentation. Among others, you can (annotated for simplicity):
add::
Create the <prefix> subtree by importing its contents
from the given <refspec> or <repository> and remote <refspec>.
merge::
Merge recent changes up to <commit> into the <prefix>
subtree.
pull::
Exactly like 'merge', but parallels 'git pull' in that
it fetches the given commit from the specified remote
repository.
push::
Does a 'split' (see above) using the <prefix> supplied
and then does a 'git push' to push the result to the
repository and refspec. This can be used to push your
subtree to different branches of the remote repository.
split::
Extract a new, synthetic project history from the
history of the <prefix> subtree. The new history
includes only the commits (including merges) that
affected <prefix>, and each of those commits now has the
contents of <prefix> at the root of the project instead
of in a subdirectory. Thus, the newly created history
is suitable for export as a separate git repository.
There are also a variety of flags that aid and manipulate the above. I believe all these options were available before via chains of plumbing commands. git-subtree.sh
just wraps them and makes them considerably easier to execute.
If you look at the old subtree code before it got added to git as a contrib module: https://github.com/apenwarr/git-subtree/blob/master/git-subtree.sh you can see that the git subtree tool is really a more advanced wrapper around the lower level git subtree merging strategies.
It basically leverages those strategies in a sensible way to make subtree management much easier. Particularly the --squash stuff is really, really useful.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With