The best answers to the question “How do I clone a single branch in Git?” in the category Dev.
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.
One way is to execute the following.
git clone [email protected]:project_name.git -b branch_name /your/folder
branch_name is the branch of your choice and “/your/folder” is the destination folder for that branch. It’s true that this will bring other branches giving you the opportunity to merge back and forth.
Now, starting with Git 1.7.10, you can now do this
git clone [email protected]:project_name.git -b branch_name --single-branch /your/folder
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>]
<url> is the URL if the remote repository, and does not reference itself the branch cloned)
You can see it in
test_expect_success 'single branch clone' ' git clone --single-branch "file://$(pwd)/." singlebranch '
Tobu comments that:
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.
See commit 132f600, commit 4731957 (21 Feb 2020) by Emily Shaffer (
(Merged by Junio C Hamano —
gitster — in commit b22db26, 05 Mar 2020)
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.
You can try the long-winded way:
mkdir newrepo.git cd newrepo.git git init git remote add origin file:///path/to/original git fetch origin branchiwant:refs/remotes/origin/branchiwant git checkout -b branchiwant --track origin/branchiwant
What this does is:
- Create and init an empty Git repository.
- Adds the original repository as a remote called origin.
- Fetches only the branch you require from the remote called origin.
- Creates and checks out a new branch that is set up to track the source branch you just cloned.
Hopefully that will be something like what you are after.
Using Git version 184.108.40.206 (on Windows), here’s what I do (
$BRANCH is the name of the branch I want to checkout and
$REMOTE_REPO is the URL of the remote repository I want to clone from):
mkdir $BRANCH cd $BRANCH git init git remote add -t $BRANCH -f origin $REMOTE_REPO git checkout $BRANCH
The advantage of this approach is that subsequent
git pull (or
git fetch) calls will also just download the requested branch.