Comment «annuler» un clone à une seule branche?

102

J'ai cloné un dépôt en utilisant le

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

Cela a cloné UNIQUEMENT cette branche, mais maintenant je veux passer au maître et aux autres branches. Existe-t-il un moyen en plus de l'effacer et de recommencer pour cloner le reste du dépôt que je peux annuler la préférence --single-branch?

Danieltalsky
la source

Réponses:

147

Vous pouvez dire à Git de retirer toutes les branches comme ceci:

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

Si vous regardez à l'intérieur .git/config, cela ressemblera à quelque chose comme ceci:

[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

J'ai comparé cela à un clone complet, et j'ai vu que la seule différence était le "chercher" sous [remote "origin"].

Remarque: j'utilise Git version 1.8.2. Les options de configuration peuvent avoir changé si vous exécutez une ancienne version de Git. Si mes commandes ne fonctionnent pas, je vous recommande de regarder .git/configpour voir si vous pouvez voir quelque chose de similaire.

sarahhodne
la source
2
Je voulais juste vous offrir un merci spécial car j'ai fait beaucoup de lecture et de recherche sur Google et je n'ai pas pu trouver quoi que ce soit de tel.
danieltalsky
2
Heureux de vous aider. L' gitoutil de ligne de commande est incroyablement puissant (en fait, la plupart des commandes sont implémentées en termes d'autres commandes), vous pouvez donc faire beaucoup de choses avec lui une fois que vous comprenez comment le référentiel est organisé (essentiellement comment le .gitdossier fonctionne ).
sarahhodne
Cela n'a pas fonctionné pour moi - après l'exécution de ces commandes git show-ref tagséchoue toujours.
felixfbecker
1
Notez que cette solution fonctionnera également si une branche a été clonée superficiellement en utilisant la syntaxe suivante, qui présente le même inconvénient décrit par OP:git clone --depth=1 --branch branchname [email protected]:foobar/repo.git destinationpath
danemacmillan
1
Wow, c'est loin d'être intuitif! C'est étrange que Git n'ait pas facilement de commande pour accomplir cela. Ouais je l'ai fait fonctionner ... et maintenant je connais le fichier de configuration dans le répertoire .git aussi!
kashiraja
61

Si vous souhaitez ajouter une seule branche, vous pouvez effectuer les opérations suivantes:

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

Fonctionne avec la version 1.9.1 de git

Dominik Pawlak
la source
1
Je suis amoureux de toi
user1760150
4
Cela ajoute plusieurs fetch =lignes à .git / config, très pratique lorsque vous voulez basculer entre deux branches sur la télécommande mais pas récupérer tout un tas d'autres branches. Merci!
Terry Brown
4

Pour ajouter une autre branche distante à mon référentiel local qui a été clonée à l'aide --single-branch, ce qui suit fonctionne pour moi:

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

Vous pouvez également utiliser des caractères génériques pour [remote-branch], par exemple

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

Cela fonctionne avec la version 2.21.1 de git . D'autres réponses suggérant de faire git fetch origin [remote-branch]:[local-branch]n'ont pas fonctionné car elles créent la branche locale dans un état non suivi. Lors de son exécution, git pullil a d'abord essayé de fusionner à nouveau tous les commits de la branche distante avec ma branche locale.

Arno Fiva
la source
2
deuxième fois je reviens à cette réponse. très utile. Merci!
godbout
1
La réponse la plus utile
Denis Itskovich
1
troisième fois lol.
godbout
On dirait que nous avons à peu près le même cycle de sortie :)
Arno Fiva
1

Ajoutez simplement le référentiel d'origine en tant que nouvelle télécommande et travaillez-vous à partir de là?

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

Vous pouvez même supprimer votre télécommande «origine» actuelle et renommer «myNewOrigin» en «origine» si vous le souhaitez.

De là, vous pouvez extraire / fusionner / rebaser.

sjakubowski
la source
0

Changez simplement le .git/configfichier de votre dépôt local, ligne fetchde [remote origin] section.

Avant quelque chose comme ça

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

Après il en sera ainsi

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

J'ai d'abord appliqué la réponse de Dominik Pawlak et cela a fonctionné. Mais je n'ai pas pu apporter d'autres modifications, après avoir engagé plus de code dans ma nouvelle branche.

Il existe une autre façon de réinitialiser single-branchentièrement, qui n'a pas été mentionnée ici:

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

Cela réinitialise tout à l'original.

Houman
la source
0

Pour moi a travaillé:

git remote remove origin
git remote add origin https://*<yourPath>*.git
git fetch
Nik Kov
la source