Como faço para “desfazer” um clone - single-branch?


102

Clonei um repo usando o

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

Este SÓ clonado este branch, mas agora eu quero mudar para o master e outros branches. Existe alguma maneira além de limpá-lo e começar a clonar o resto do repo para que eu possa desfazer a preferência - single-branch?

Respostas:


147

Você pode dizer ao Git para puxar todos os branches assim:

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

Se você olhar para dentro .git/config, será algo assim:

[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/master:refs/remotes/origin/master
[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

Eu comparei isso com um clone completo, e vi que a única diferença era o "fetch" em [remote "origin"] .

Observação: estou executando o Git versão 1.8.2. As opções de configuração podem ter mudado se você estiver executando uma versão mais antiga do Git. Se meus comandos não funcionarem, recomendo dar uma olhada .git/configpara ver se você consegue ver algo semelhante.


2
Só queria agradecer especialmente porque eu li um monte de coisas e pesquisei no Google e não consegui encontrar nada parecido com isso.
danieltalsky

2
Feliz em ajudar. A gitferramenta de linha de comando é incrivelmente poderosa (na verdade, a maioria dos comandos são implementados em termos de outros comandos), então você pode fazer um monte de coisas com ela depois de entender como o repositório é organizado (basicamente como a .gitpasta funciona )
Sarahhodne

Isso não funcionou para mim - depois de executar esses comandos git show-ref tagsainda falha.
felixfbecker

1
Observe que essa solução também funcionará se um branch foi clonado superficialmente usando a seguinte sintaxe, que apresenta a mesma deficiência descrita por OP:git clone --depth=1 --branch branchname git@github.com:foobar/repo.git destinationpath
danemacmillan

1
Uau, isso está longe de ser intuitivo! É estranho que o Git não tenha prontamente um comando para fazer isso. Sim, comecei a trabalhar ... e agora eu sei sobre o arquivo de configuração no diretório .git também!
kashiraja

60

Se quiser adicionar um único branch, você pode fazer o seguinte:

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

Funciona com git versão 1.9.1


1
Estou apaixonado por você
user1760150

4
Isso adiciona várias fetch =linhas a .git / config, muito útil quando você deseja alternar entre dois ramos no remoto, mas não busca um monte de outros ramos. Obrigado!
Terry Brown,

4

Para adicionar outro branch remoto ao meu repositório local que foi clonado usando --single-branch, o seguinte funciona para mim:

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

Você também pode usar curingas para [remote-branch], por exemplo

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

Isso funciona usando git versão 2.21.1 . Outras respostas sugerindo fazer git fetch origin [remote-branch]:[local-branch]não funcionaram, pois isso cria a filial local em um estado não rastreado. Ao executá- git pulllo primeiro tentei mesclar todos os commits do branch remoto ao meu local mais uma vez.


2
segunda vez, volto a esta resposta. muito útil. obrigado!
quase

1
A resposta mais útil
Denis Itskovich

1
terceira vez lol.
quase

Parece que temos o mesmo ciclo de lançamento :)
Arno Fiva

1

Basta adicionar o repositório original como um novo controle remoto e trabalhar a partir daí?

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

Você pode até mesmo excluir seu controle remoto de 'origem' atual e renomear 'myNewOrigin' para 'origem' se desejar.

De lá, você pode puxar / mesclar / rebase.


0

Basta alterar o .git/configarquivo do seu repo local, linha fetchde[remote origin] section .

Antes de algo assim

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

Depois será assim

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

0

Eu inicialmente apliquei a resposta de Dominik Pawlak e funcionou. Mas não fui capaz de extrair mais alterações, depois de comprometer mais código em meu novo branch.

Existe outra maneira de redefinir single-branchtotalmente, que não foi mencionada aqui:

git remote remove origin
git remote add origin git@gitlab.com:{yourProject}/{yourRepo}.git
git branch --set-upstream-to=origin/{yourBranch}  {yourBranch}
git pull

Isso restaura tudo para o original.


0

Para mim funcionou:

git remote remove origin
git remote add origin https://*<yourPath>*.git
git fetch
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.