Posted By: Anonymous
I have a local Git repository called ‘skeleton’ that I use for storing project skeletons. It has a few branches, for different kinds of projects:
[email protected] [~/Projects/skeleton] git branch * master rails c c++
If I want to check out the master branch for a new project, I can do
[email protected] [~/Projects] git clone skeleton new Initialized empty Git repository in /Users/casey/Projects/new/.git/
and everything is how I want it. Specifically, the new master branch points to the skeleton master branch, and I can push and pull to move around changes to the basic project setup.
What doesn’t work, however, is if I want to clone another branch. I can’t get it so that I only pull the branch I want, for instance the
rails branch, and then the new repository has a
master branch that pushes to and pulls from the skeleton repository’s
rails branch, by default.
Is there a good way to go about doing this? Or, maybe this isn’t the way that Git wants me to structure things, and I’m certainly open to that. Perhaps I should have multiple repositories, with the Ruby on Rails skeleton repository tracking the master skeleton repository? And any individual project cloning the Ruby on Rails skeleton repository.
Note: the git1.7.10 (April 2012) actually allows you to clone only one branch:
# clone only the remote primary HEAD (default: origin/master) git clone <url> --single-branch # as in: git clone <url> --branch <branch> --single-branch [<folder>]
You can see it in
test_expect_success 'single branch clone' ' git clone --single-branch "file://$(pwd)/." singlebranch '
This is implicit when doing a shallow clone.
git clone --depth 1the easiest way to save bandwidth.
And since Git 1.9.0 (February 2014), shallow clones support data transfer (push/pull), so that option is even more useful now.
See more at "Is
git clone --depth 1 (shallow clone) more useful than it makes out?".
"Undoing" a shallow clone is detailed at "Convert shallow clone to full clone" (git 1.8.3+)
# unshallow the current branch git fetch --unshallow # for getting back all the branches (see Peter Cordes' comment) git config remote.origin.fetch refs/heads/*:refs/remotes/origin/* git fetch --unshallow
As Chris comments:
the magic line for getting missing branches to reverse
--single-branchis (git v2.1.4):
git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/* git fetch --unshallow
With Git 2.26 (Q1 2020), "
git clone --recurse-submodules --single-branch" now uses the same single-branch option when cloning the submodules.
clone: pass –single-branch during –recurse-submodules
Signed-off-by: Emily Shaffer
Acked-by: Jeff King
Previously, performing "
git clone --recurse-submodules --single-branch" resulted in submodules cloning all branches even though the superproject cloned only one branch.
--single-branchthrough the submodule helper framework to make it to ‘
clone‘ later on.