Git Subtree Splitter
splitsh-lite replaces the
subtree split Git built-in command to make
splitting a monolithic repository to read-only standalone repositories
easy and fast.
Why do I need this tool?
When starting a project, do you store all the code in one repository? Or are you creating many standalone repositories?
Both strategies work well and both have drawbacks as well. splitsh helps use both strategies by providing tools that automatically synchronize a monolithic repository to standalone repositories in real-time.
splitsh-lite is a sub-project that provides a faster implementation of the
git subtree split command, which helps create standalone repositories for one
or more sub-directories of a main repository.
If you want to learn more about monorepo vs manyrepos, watch this 4-minute lightning talk I gave at dotScale (or read the slides)... or watch the longer version from DrupalCon. ["The Monorepo - Storing your source code has never been so much fun"](The Monorepo - Storing your source code has never been so much fun) is also a great resource.
The fastest way to get started is to download a binary for your platform.
You can also install it manually.
Let's say you want to split the
lib/ directory of a repository to its own
branch; from the "master" Git repository (bare or clone), run:
The sha1 of the split is displayed at the end of the execution:
The sha1 can be used to create a branch or to push the commits to a new repository.
Automatically create a branch for the split by passing a branch name
splitsh-lite --prefix=lib/ --target=branch-name
If new commits are made to the repository, update the split by running the same
command again. Updates are much faster as splitsh-lite keeps a cache of
already split commits. Caching is possible as splitsh-lite guarantees that
two splits of the same code always results in the same history and the same
sha1s for each commit.
By default, splitsh-lite splits the currently checked out branch but you can
split a different branch by passing it explicitly via the
(mandatory when splitting a bare repository):
splitsh-lite --prefix=lib/ --origin=origin/master
You don't even need to run the command from the Git repository directory if you
splitsh-lite --prefix=lib/ --origin=origin/1.0 --path=/path/to/repo
--prefixis the prefix of the directory to split; you can put the split contents in a sub-directory of the target repository by using the
--prefix=from:tosyntax; split several directories by passing multiple
--pathis the path of the repository to split (current directory by default);
--originis the Git reference for the origin (can be any Git reference like
origin/xxx, or any
--targetcreates a reference for the tip of the split (can be any Git reference like
origin/xxx, or any
--progressdisplays a progress bar;
--quietsuppresses all output on stderr (useful when run from an automated script);
--scratchflushes the cache (useful when a branch is force pushed or in case of a cache corruption);
git subtree split
git subtree split to
splith-lite is easy as both tools
generate the same
However, note that older versions of
git subtree split used broken
algorithms, and so generated different
sha1s than the latest version. You can
simulate those version via the
--git flag. Use
on which version of
git subtree split you want to simulate.
If you want to contribute to
splitsh-lite or use it as a library, you first
need to install
go get -d github.com/libgit2/git2go cd $GOPATH/src/github.com/libgit2/git2go git checkout next git submodule update --init make install
go get github.com/splitsh/lite go build -o splitsh-lite github.com/splitsh/lite
If everything goes fine, a
splitsh-lite binary should be available in the