How do I "undo" a --single-branch clone?
Asked Answered
H

7

169

I cloned a repo using the

git clone -b <branch name> --single-branch <github url> <target directory>

This cloned ONLY this branch, but now I want to switch to the master and other branches. Is there any way besides clearing it out and starting over to clone the rest of the repo that I can undo the --single-branch preference?

Hypomania answered 18/7, 2013 at 3:45 Comment(0)
S
245

You can tell Git to pull all branches like this:

git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch origin

If you look in .git/config, it'll look something like this:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = false
[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

I compared this to a full clone, and saw that the only difference was the "fetch" under [remote "origin"].

Note: I'm running Git version 1.8.2. The config options may have changed if you're running an older version of Git. If my commands don't work, then I'd recommend looking through .git/config to see if you can see something similar.

Sofia answered 18/7, 2013 at 4:48 Comment(6)
Just wanted to offer you a special thanks because I did a heck of a lot of reading and googling and wasn't able to come across anything like this.Hypomania
Glad to help. The git command line tool is incredibly powerful (in fact, most of the commands are implemented in terms of other commands), so you can do a whole lot of stuff with it once you understand how the repository is laid out (basically how the .git folder works).Sofia
This didn't work for me - after running these commands git show-ref tags still fails.Seasick
Note that this solution will also work if a branch was shallow cloned using the following syntax as well, which experiences the same shortcoming described by OP: git clone --depth=1 --branch branchname [email protected]:foobar/repo.git destinationpathAmitie
Wow, this is far from intuitive! It's odd Git doesn't readily have a command to accomplish this. Yeah I got it working... and now I know about the config file int he .git directory too!Comfrey
I was able to do this without manually changing the config: git remote set-branches --add origin '*' and then git fetch.Persecution
F
96

If you want to add a single branch, you can do the following:

git remote set-branches --add origin [remote-branch]
git fetch origin [remote-branch]:[local-branch]

Works with git version 1.9.1

Fitzger answered 9/1, 2015 at 11:57 Comment(2)
This adds multiple fetch = lines to .git/config, very handy when you want to switch between two branches on the remote but not fetch a whole bunch of other branches. Thanks!Impartial
This does not answer the question.Consummate
M
26

To add another remote branch to my local repository that was cloned using --single-branch, the following works for me:

git remote set-branches --add origin [remote-branch]
git fetch
git checkout [remote-branch]

You can also use wildcards for [remote-branch], e.g.

git remote set-branches --add origin release-1.*
git fetch
git checkout release-1.5

This works using git version 2.21.1. Other answers suggesting to do git fetch origin [remote-branch]:[local-branch] did not work as it creates the local branch in an untracked state. When running git pull it first tried to merge all the commits of the remote branch to my local one once again.

Moor answered 25/3, 2020 at 9:43 Comment(4)
second time i come back to this answer. very useful. thanks!Hyland
The most useful answerSpeechmaker
I've been here several times xdPiezochemistry
Thanks a bunch!Debussy
C
8

For me worked:

git remote remove origin
git remote add origin https://*<yourPath>*.git
git fetch
Chrissie answered 29/7, 2020 at 22:58 Comment(2)
Easiest solution without messing with git config.Rebuttal
This should also be an accepted answer. Works just fineEncore
S
1

Just add the original repo as a new remote, and work off of there?

git remote add path/to/myrepo myNewOrigin
git fetch myNewOrigin

You can even delete your current 'origin' remote and rename 'myNewOrigin' to 'origin' if you would want to.

From there you can pull/merge/rebase.

Supererogate answered 18/7, 2013 at 4:2 Comment(0)
A
0

Just change .git/config file of your local repo, line fetch of [remote origin] section.

Before something like this

[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/master:refs/remotes/origin/master

After it will be so

[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*
Ascocarp answered 10/12, 2019 at 15:20 Comment(0)
M
0

I initially applied Dominik Pawlak's answer and it worked. But I wasn't able to pull any further changes, after I committed more code into my new branch.

There is another way of resetting single-branch entirely, which hasn't been mentioned here:

git remote remove origin
git remote add origin [email protected]:{yourProject}/{yourRepo}.git
git branch --set-upstream-to=origin/{yourBranch}  {yourBranch}
git pull

This resets everything to the original.

Missend answered 18/2, 2020 at 7:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.