Come si "annulla" un clone --single-branch?


102

Ho clonato un repository usando l'estensione

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

Questo ha clonato SOLO questo ramo, ma ora voglio passare al master e ad altri rami. C'è un modo oltre a cancellarlo e ricominciare a clonare il resto del repository in cui posso annullare la preferenza --single-branch?

Risposte:


147

Puoi dire a Git di estrarre tutti i rami in questo modo:

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

Se guardi dentro .git/config, avrà un aspetto simile a questo:

[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

L'ho confrontato con un clone completo e ho visto che l'unica differenza era il "fetch" sotto [remote "origin"].

Nota: sto eseguendo Git versione 1.8.2. Le opzioni di configurazione potrebbero essere cambiate se stai utilizzando una versione precedente di Git. Se i miei comandi non funzionano, allora consiglierei di guardare attraverso .git/configper vedere se riesci a vedere qualcosa di simile.


2
Volevo solo offrirti un ringraziamento speciale perché ho letto moltissimo e ho cercato su Google e non sono riuscito a trovare nulla di simile.
danieltalsky

2
Felice di aiutare. Lo gitstrumento da riga di comando è incredibilmente potente (in effetti, la maggior parte dei comandi sono implementati in termini di altri comandi), quindi puoi fare un sacco di cose con esso una volta capito come è disposto il repository (fondamentalmente come funziona la .gitcartella ).
sarahhodne

Questo non ha funzionato per me - dopo aver eseguito questi comandi git show-ref tagsancora non riesce.
felixfbecker

1
Si noti che questa soluzione funzionerà anche se un ramo è stato clonato in modo superficiale utilizzando anche la seguente sintassi, che presenta la stessa mancanza descritta da OP:git clone --depth=1 --branch branchname git@github.com:foobar/repo.git destinationpath
danemacmillan

1
Wow, questo è tutt'altro che intuitivo! È strano che Git non abbia prontamente un comando per farlo. Sì, ho funzionato ... e ora so anche del file di configurazione nella directory .git!
kashiraja

60

Se vuoi aggiungere un singolo ramo, puoi fare quanto segue:

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

Funziona con git versione 1.9.1


1
Sono innamorato di te
utente1760150

4
Questo aggiunge più fetch =righe a .git / config, molto utile quando si desidera passare da un ramo all'altro sul telecomando ma non recuperare un intero gruppo di altri rami. Grazie!
Terry Brown

4

Per aggiungere un altro ramo remoto al mio repository locale che è stato clonato utilizzando --single-branch, per me funziona quanto segue:

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

È inoltre possibile utilizzare caratteri jolly per [remote-branch], ad es

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

Funziona utilizzando la versione 2.21.1 di git . Altre risposte che suggerivano di fare git fetch origin [remote-branch]:[local-branch]non hanno funzionato in quanto crea il ramo locale in uno stato non tracciato. Durante l'esecuzione, git pullho provato per la prima volta a unire nuovamente tutti i commit del ramo remoto a quello locale.


2
la seconda volta torno a questa risposta. molto utile. Grazie!
Godbout

1
La risposta più utile
Denis Itskovich

1
terza volta lol.
Godbout

Sembra che abbiamo più o meno lo stesso ciclo di rilascio :)
Arno Fiva il

1

Basta aggiungere il repository originale come nuovo telecomando e lavorare da lì?

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

Puoi anche eliminare il tuo attuale telecomando "origin" e rinominare "myNewOrigin" in "origin", se lo desideri.

Da lì puoi eseguire il pull / merge / rebase.


0

Basta cambiare il .git/configfile del tuo repository locale, riga fetchdi[remote origin] section .

Prima di qualcosa di simile

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

Dopo sarà così

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

0

Inizialmente ho applicato la risposta di Dominik Pawlak e ha funzionato. Ma non sono stato in grado di eseguire ulteriori modifiche, dopo aver eseguito il commit di più codice nel mio nuovo ramo.

C'è un altro modo per ripristinare single-branchcompletamente, che non è stato menzionato qui:

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

Questo ripristina tutto all'originale.


0

Per me ha funzionato:

git remote remove origin
git remote add origin https://*<yourPath>*.git
git fetch
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.