Question Comment aller chercher toutes les branches git?


J'ai cloné un dépôt git, qui contient environ 5 branches. Cependant, quand je fais git branch Je ne vois que l'un d'entre eux:

$ git branch
* master

Je sais que je peux faire git branch -a à voir tout les branches, mais comment puis-je tirer toutes les branches localement alors quand je fais git branch, ça montre:

$ git branch
* master
* staging
* etc...

940
2018-04-25 09:05


origine


Réponses:


J'ai écrit ma réponse il y a quelque temps et la dernière downvote m'a motivé à la mettre à jour avec mon expérience ultérieure :-)

Edit: la version précédente de cette réponse a créé des branches avec le préfixe 'origin', toutes pointant vers la branche master, au lieu de branches réelles, et ayant des problèmes avec les extensions variables. Cela a été corrigé selon les commentaires.

Vous pouvez récupérer une branche de toutes les télécommandes comme ceci:

git fetch --all

fetch met à jour les copies locales des succursales distantes afin que celles-ci soient toujours sécurisées pour vos succursales locales MAIS:

  1. fetch ne sera pas mettre à jour branches locales (qui Piste branches éloignées); Si vous voulez mettre à jour vos succursales locales, vous devez toujours tirer toutes les branches.

  2. fetch ne sera pas créer branches locales (qui Piste branches distantes), vous devez le faire manuellement. Si vous voulez lister toutes les branches distantes: git branch -a

À mettre à jour branches locales qui suivent les succursales distantes:

git pull --all

Cependant, cela peut être encore insuffisant. Cela fonctionnera seulement pour vos branches locales qui traquent des branches distantes. Pour effectuer le suivi de toutes les succursales distantes, exécutez ce programme AVANT  git pull --all:

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

TL; DR version

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

(Il semble que pull tire toutes les branches de toutes les télécommandes, mais je cherche toujours d'abord juste pour être sûr)

Exécutez la première commande uniquement s'il existe des branches distantes sur le serveur qui ne sont pas suivies par vos branches locales.

P.S. Autant que je sache git fetch --all et git remote update sont équivalents.



Kamil Szot's commentaire, que 74 (au moins) personnes ont trouvé utile.

Je devais utiliser:

for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done

parce que votre code a créé des branches locales nommées origin/branchname et   J'obtenais "refname 'origine / nom de la branche" est ambigu à chaque fois que je   renvoyé à celui-ci.


1261
2018-04-25 09:10



Pour répertorier les branches distantes:
git branch -r 

Vous pouvez les vérifier en tant que branches locales avec:
git checkout -b LocalName origin/remotebranchname


419
2018-04-25 10:00



Vous aurez besoin de créer des succursales locales pour le suivi des succursales distantes.

En supposant que vous avez seulement une télécommande appelée originCet extrait va créer des branches locales pour tous les suivis distants:

for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

Après ça, git fetch --all mettra à jour toutes les copies locales des succursales distantes.

Aussi, git pull --all mettra à jour vos branches de suivi locales, mais en fonction de vos validations locales et de la configuration de l'option de configuration 'merge', il se peut que vous créiez un commit de fusion, une avance rapide ou un échec.


159
2018-01-17 15:33



Si tu fais:

git fetch origin

alors ils seront tous là localement. Si vous effectuez ensuite:

git branch -a

vous les verrez listés comme des télécommandes / origin / branch-name. Comme ils sont là localement, vous pouvez faire ce que vous voulez avec eux. Par exemple:

git diff origin/branch-name 

ou

git merge origin/branch-name

ou

git checkout -b some-branch origin/branch-name

96
2018-04-25 13:52



$ git remote update  
$ git pull --all

Cela suppose que toutes les branches sont suivies

si elles ne le sont pas, vous pouvez tirer cela dans bash

for remote in `git branch -r `; do git branch --track $remote; done

Ensuite, exécutez la commande.


42
2018-04-25 09:07



qu'en est-il de git fetch && git checkout RemoteBranchName ? fonctionne très bien pour moi ...


34
2018-05-08 16:14



Le bash de la boucle ne fonctionnait pas pour moi, mais cela faisait exactement ce que je voulais. Toutes les branches de mon origine ont reflété le même nom localement.

git fetch origin '+refs/heads/*:refs/heads/*'

27
2017-10-28 20:02



Lorsque vous clonez un référentiel, toutes les informations des branches sont effectivement téléchargées mais les branches sont masquées. Avec la commande

$ git branch -a

vous pouvez afficher toutes les branches du référentiel et avec la commande

$ git checkout -b branchname origin/branchname

vous pouvez ensuite les "télécharger" manuellement un à la fois.


Cependant, il y a un moyen beaucoup plus propre et plus rapide, même si c'est un peu compliqué. Vous avez besoin de trois étapes pour accomplir ceci:

  1. Premier pas

    créez un nouveau dossier vide sur votre ordinateur et clonez une copie miroir du dossier .git du référentiel:

    $ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
    $ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git
    

    le référentiel local dans le dossier my_repo_folder est toujours vide, il y a juste un dossier .git caché que vous pouvez voir avec une commande "ls -alt" depuis le terminal.

  2. Deuxième étape

    passer ce référentiel d'un référentiel vide (nu) à un référentiel normal en basculant la valeur booléenne "nue" des configurations git sur false:

    $ git config --bool core.bare false
    
  3. Troisième étape

    Saisissez tout ce qui se trouve dans le dossier actuel et créez toutes les branches sur la machine locale, ce qui en fait un repo normal.

    $ git reset --hard
    

Alors maintenant, vous pouvez simplement taper la commande git branch et vous pouvez voir que toutes les branches sont téléchargées.

C'est la manière rapide dont vous pouvez cloner un dépôt git avec toutes les branches à la fois, mais ce n'est pas quelque chose que vous voulez faire pour chaque projet de cette manière.


25
2017-12-06 20:12



Je n'utilise généralement rien d'autre que des commandes comme celle-ci:

git fetch origin
git checkout --track origin/remote-branch

Une version un peu plus courte:

git fetch origin
git checkout -t origin/remote-branch

23
2017-07-07 14:42



Vous pouvez aller chercher toutes les branches en:

git fetch --all

ou:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

le --depth=10000 Ce paramètre peut vous aider si vous avez un référentiel superficiel.


Pour tirer toutes les branches, utilisez:

git pull --all

Si ci-dessus ne fonctionne pas, alors précedez la commande ci-dessus avec:

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

comme le remote.origin.fetch ne pouvait prendre en charge qu'une branche spécifique lors de la récupération, en particulier lorsque vous cloniez votre repo avec --single-branch. Vérifiez ceci par: git config remote.origin.fetch.

Après cela, vous devriez être en mesure de commander une succursale.

Voir également:


Pour pousser toutes les branches vers la télécommande, utilisez:

git push --all

finalement --mirror pour refléter toutes les références.


Si votre objectif est de dupliquer un référentiel, consultez: Dupliquer un référentiel article à GitHub.


17
2017-10-11 20:04



Si vous cherchez ici une solution pour obtenir toutes les branches et ensuite migrer tout vers un autre serveur Git, j'ai assemblé le processus ci-dessous. Si vous souhaitez simplement mettre à jour toutes les branches localement, arrêtez-vous à la première ligne vide.

git clone <ORIGINAL_ORIGIN>
git branch -r | awk -F'origin/' '!/HEAD|master/{print $2 " " $1"origin/"$2}' | xargs -L 1 git branch -f --track 
git fetch --all
git pull --all

git remote set-url origin <NEW_ORIGIN>
git pull
<resolve_any_merge_conflicts>
git push --all
git push --tags
<check_NEW_ORIGIN_to_ensure_it_matches_ORIGINAL_ORIGIN>

12
2018-02-05 23:55