How do I clone a single branch in Git?
branch, git, git-clone
Solution
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>
Note:
- `<url>` is the URL of the remote repository, and does not reference the branch cloned
- `<folder>` is the local folder where you want to clone the repository
You can see it in `t5500-fetch-pack.sh`:
test_expect_success 'single branch clone' '
git clone --single-branch "file://$(pwd)/." singlebranch
'
Tobu comments that:
This is implicit when doing a shallow clone. This makes `git clone --depth 1` the 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-branch` is (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 (`nasamuffin`). (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.
Pipe `--single-branch` through the submodule helper framework to make it to '`clone`' later on.
Problem
I have a local Git repository in `~/local_repo`. It has a few branches: ``` $ git branch * master rails c c++ ``` To clone the local repository, I do: ``` $ git clone ~/local_repo new_repo Initialized empty Git repository in /home/username/new_repo/.git/ ``` The `new_repo` master branch points to the `local_repo` master branch, and I can push / pull. But I am unable to clone another branch. I want to only pull the branch I want (e.g. `rails`), so that the new repository has a `master` branch that pushes to and pulls from `local_repo`'s `rails` branch, by default. How do I accomplish this, or perhaps something similar with `local_repo` tracking the master `local_repo`?
Related problems
- How do I create a new GitHub repo from a branch in an existing repo?
- How do you stop tracking a remote branch in Git?
- Clone only one branch
- In Git, what is the difference between origin/master vs origin master?
- How to convert a Git shallow clone to a full clone?
- Is it safe to shallow clone with --depth 1, create commits, and pull updates again?
- How do I fetch only one branch of a remote Git repository?