Split up the given big repo into individual package-related repos.
-
Keep the common code in a submodule in those repos (e.g., as
common/
). -
Try to keep the related git history intact (using
git subtree split
). -
The split-up repos are to be in the same path level as the parent one, unless a second argument is provided (see
usage()
).
Original motivation is to split up the monolithic rpm-specs repo into individual package-related repos.
This script uses The Easy Way(tm): https://stackoverflow.com/questions/359424/detach-move-subdirectory-into-separate-git-repository/17864475#17864475
Copy bin/split-git
into one of the paths in $PATH
:
$ git clone https://github.com/riboseinc/split-git
$ export PATH="${PWD}/split-git/bin:${PATH}"
$ split-git
Usage: split-git ...
$ split-git <big-repo-path> [target-subrepo-path]
a@b:~/big-repo$ ls
a/ b/ c/ d/ e/
a@b:~/big-repo$ ls */prepare.sh
a/prepare.sh c/prepare.sh e/prepare.sh
b/prepare.sh d/prepare.sh
a@b:~/big-repo$ git branch
* split
master
a@b:~/big-repo$ mkdir /tmp/split-repos
a@b:~/big-repo$ COMMON_LINK=clone \
> SUB_REPO_PREFIX=myrepo- \
> SUB_REPO_INDICATOR_FILE=prepare.sh \
> BIG_REPO_POST_SPLIT_BRANCH=split \
> BIG_REPO_REF_IN_SUB_REPO=common \
> BIG_REPO_SPLIT_BRANCH_PREFIX=split- \
> split-git ~/big-repo /tmp/split-repos
... ...
a@b:~/big-repo$ cd /tmp/split-repos; ls
myrepo-a/ myrepo-c/ myrepo-e/
myrepo-b/ myrepo-d/
a@b:/tmp/split-repos$ cd myrepo-a; ls
common/
a@b:/tmp/split-repos/myrepo-a$ cd common; git branch
* split
split-a
split-b
split-c
split-d
split-e
master
- COMMON_LINK
-
-
enums:
clone
|sym
|sub
-
default:
sub
-
The method {
sub
|sym
|clone
} to use when linking from sub-repo to the big-repo
-
- SUB_REPO_PREFIX
-
-
default:
myrepo-
-
The prefix prepended to ${package_name}, as the sub-repo name
-
- SUB_REPO_INDICATOR_FILE
-
-
default:
prepare.sh
-
The file within a subfolder in big-repo that indicates fit for splitting
-
- BIG_REPO_POST_SPLIT_BRANCH
-
-
default:
split
-
The branch in big repo crafted for post-split operations
-
- BIG_REPO_REF_IN_SUB_REPO
-
-
default:
common
-
The path within each sub-repo that references the big repo
-
- BIG_REPO_SPLIT_BRANCH_PREFIX
-
-
default:
split-
-
The branch name prefix for each sub-repo-branch created in big repo
-
Bug reports and pull requests are welcome on GitHub at https://github.com/riboseinc/split-git. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.
The software is available as open source under the terms of the MIT License.