73 votes

Git Hub Clone toutes les branches à la fois

J'essaie de cloner un dépôt entier sur ma machine sous linux. J'ai utilisé

git clone <url>   

Je suis ensuite allé dans le dossier où il a été téléchargé et j'ai tapé

git branch 

dans le terminal. Il ne me montre que master et pas les autres branches qui étaient dans le référentiel distant. Comment cloner toutes les branches ?

Je sais que pour chaque branche dans le remote je peux utiliser séparément

git checkout -b <name of local branch> origin/<name of remote branch>

mais y a-t-il un autre moyen que celui-là ?

5 votes

git branch -a liste toutes les branches. Voir aussi git branch --help

0 votes

1 votes

81voto

dovy Points 358

(1) Dans le répertoire local de git, créez un nouveau fichier sh.

touch getAllBranches.sh
vi getAllBranches.sh

(2) Insérer le contenu ci-dessous dans getAllBranches.sh fichier :

for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
   git branch --track ${branch#remotes/origin/} $branch
done

(3) Obtenez toutes les branches :

chmod +x getAllBranches.sh    
sh getAllBranches.sh

(4) Vérifier le résultat dans le référentiel local :

git branch

Par exemple, j'utilise le référentiel : https://github.com/donhuvy/spring-boot

Comme vous pouvez le voir, j'ai récupéré toutes les branches sur la machine locale :

enter image description here

0 votes

Deux commentaires : si l'on a déjà ajouté des problèmes en amont, donc pense que le script devrait être "git branch -a | grep remotes | grep -v HEAD | grep -v master | grep -v upstream" (supprimer les branches amont). Aussi, pourquoi le --track ? Ne serait-il pas plus cohérent de ne pas utiliser cette option, c'est-à-dire que les récupérations et fusions en amont de master seraient identiques à celles de n'importe quelle branche ?

1 votes

Pas nécessaire. Voir la réponse de Xiong ci-dessous.

57voto

Amit Gupta Points 10448

Ce n'est pas très compliqué, les étapes sont très simples et directes :

Après avoir cloné le repo, exécutez $ cd myproject

git branch -a Cela vous montrera toutes les branches distantes.

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental

Si vous voulez travailler sur une branche distante, vous devez créer une branche locale de suivi :

$ git checkout -b experimental origin/experimental

Vérifiez si vous êtes dans la branche désirée par la commande suivante ;

$ git branch

Le résultat sera le suivant ;

*experimental
master
some branch2
some branch3 

Remarquez le signe * qui indique la branche actuelle.

1 votes

J'ai essayé cette méthode. Mais je ne vois que master et experimental après avoir tapé git branch . Quelqu'un d'autre a le même problème ?

0 votes

@Brian Je suis sûr que vous l'avez trouvé maintenant, mais la clé est le -a l'interrupteur, c'est-à-dire git branch -a .

23voto

Moja Ra Points 453
git clone --bare <repository url goes here> .git

Ensuite, après que le repo soit cloné avec toutes ses branches, faites ce qui suit

git config --bool core.bare false

git reset --hard

2 votes

Cela a marché pour moi mais avec --mirror au lieu de --bare . Les télécommandes peuvent être restaurées en utilisant : for branch in $( git branch -a | sed 's/^..//' ); do git checkout $branch; git branch --set-upstream-to=$branch $branch; done (pour une raison quelconque $( git branch -a ) ajoute également les fichiers du répertoire courant à la liste, d'où la présence de sed)

1 votes

--mirror a le même effet que --bare . --mirror crée un référentiel nu.

0 votes

--bare a mieux fonctionné pour moi que --mirror, parce que mirror créait un fichier .git qui était en fait le fichier caché créé par git.

17voto

Xiong Chiamiov Points 1734

Il me montre seulement master et pas les autres branches qui étaient dans le dépôt distant. Comment cloner toutes les branches ?

Les branches sont essentiellement des pointeurs vers les commits. Lorsque vous faites un git clone (ou un git fetch ), vous récupérez tous les commits du dépôt distant, ainsi que toutes ses branches.

Cependant, git branch n'affiche pas les branches distantes par défaut. Au lieu de cela, il vous montre votre local des branches, qui peuvent ou non avoir une relation avec les branches qui existent sur le distant. Si vous exécutez git branch --all git signalera toutes les branches qu'il connaît, qu'elles soient locales ou distantes.

Il est important de noter que les balises pas fonctionnent de cette manière, et il n'y a pas de distinction entre une étiquette locale et une étiquette distante.

2 votes

Votre réponse est utile à la compréhension, mais ne répond pas à la vraie question de savoir comment obtenir toutes les branches de sorte que vous pouvez passer de l'une à l'autre (pour nous, les débutants de git). La réponse choisie semble le faire, mais si vous avez une meilleure idée, j'aimerais l'entendre.

5 votes

@DavidH En général, il n'y a rien de spécial à faire ; git branch -a affichera les branches distantes, et si vous vérifiez un nom de branche qui n'existe pas localement, mais qui existe sur la branche distante, git créera automatiquement une branche locale pour vous.

0 votes

Je ne suis pas en mesure de tester en ce moment - j'en déduis que si je vois des branches comme "remotes/origin/experimental", je peux alors simplement "git checkout experimental" et cela fera ce que vous dites ci-dessus ?

3voto

togume Points 150

Pour télécharger un dépôt complet, incluant toutes les branches, utilisez la commande suivante : git clone --mirror <URI>

Cela créera un dossier appelé repository.git à moins que vous ne lui donniez un nom différent.

Maintenant, cela vous donne un clone complet du dépôt d'origine, mais parce qu'il est en bare=true mode, vous n'avez pas d'arbre de travail. En fait, ce que vous avez, c'est le .git y compris toutes les branches et le contenu. C'est une façon élégante de dire que vous n'aurez pas un accès direct aux fichiers parce qu'ils sont cachés dans le système git (compressés, etc.).

Pour en faire un dépôt git "normal", nous devons faire de ce clone le dépôt git "normal". .git dans un nouveau dossier, qui sera notre dossier habituel de repo :

mkdir <repo folder name> mv repository.git <repo folder name>/.git cd <repo folder name> git checkout master

Notez qu'il n'y a pas de commande git native pour télécharger toutes les branches distantes, donc la manière la plus simple est de s'assurer que vous avez poussé tous les commits vers l'origine, et ensuite de re-télécharger le dépôt entier à nouveau en utilisant cette option --mirror.

1 votes

Ça a surtout marché pour moi, sauf que git checkout master a échoué avec fatal: this operation must be run in a work tree . Retrait de bare=true de .git\config J'ai corrigé ça.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X