Comment récupérer toutes les branches Git
J'ai cloné un dépôt Git, qui contient environ cinq branches. Cependant, quand je git branch
je ne vois que l'un d'entre eux:
$ git branch
* master
Je sais que je peux faire git branch -a
à voir tous les branches, mais comment pourrais-je tirer toutes les branches localement donc quand je fais des git branch
, il montre la suite?
$ git branch
* master
* staging
* etc...
- Également discuté lors de stackoverflow.com/questions/67699/...
- Cette question montre comment obtenir toutes les branches après l'utilisation de la
--single-branch
réglage lorsque le clonage: stackoverflow.com/questions/17714159/... (git fetch --all
ne fonctionnera jamais si vous avez spécifié une seule branche!) - Vous ne verrez pas que la sortie jamais, car l'astérisque représente la branche qui est actuellement à la caisse de sortie. Puisque vous ne pouvez avoir qu'une seule branche vérifié à la fois, vous pouvez avoir un seul astérisque sur la gauche de votre branche d'inscription.
- Le meilleur classement de réponse ci-dessous rate l'OP de l'intention. Je recommande que vous regardez stackoverflow.com/a/72156/342839 à la place.
git checkout -b <branch>
semble la réponse la plus probable. - J'ai vu beaucoup de réponses, mais aucun d'entre eux a mentionné, je pense que ce est probablement la façon la plus simple pour faire ce que vous voulez:
git clone --bare <repo url> .git
(notez que vous devez ajouter "--bare" et ".git" à la fin de cloner le repo comme un "nu" repo), puisgit config --bool core.bare false
() définit le "nu" drapeau de faux), puisgit reset --hard
(mouvements de la TÊTE à l'actuel CHEF sur le repo). Maintenant, si vousgit branch
vous devriez voir toutes les branches de l'opération vous cloné. - Double Possible de Comment cloner toutes les branches distantes dans Git?
- Pourquoi ne pas vous écrire cela comme une réponse?
- Je pourrais, mais il y a déjà accepté de répondre à 912 upvotes, plus un autre de 20 réponses. Je pense qu'il est plus probable que quelqu'un aurait lu mon commentaire de réponse tout le chemin sur le bas de ce fil. Si vous aimez le commentaire vous pouvez upvote afin que d'autres personnes seraient plus susceptibles de le lire.
- Ensuite, vous abusez de la fonctionnalité de commentaires sur un Débordement de Pile. Les utilisateurs peuvent upvote votre commentaire, mais pas downvote.
git fetch origin
fera.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez récupérer toutes les branches de toutes les télécommandes comme ceci:
C'est essentiellement un pouvoir se déplacer.
fetch
mises à jour des copies locales des branches distantes donc, c'est toujours plus sûr pour vos branches locales MAIS:fetch
ne mise à jour branches locales (qui piste branches distantes); si vous souhaitez mettre à jour vos branches locales vous avez encore besoin de tirer sur chaque branche.fetch
ne créer branches locales (qui piste branches distantes), vous devez le faire manuellement. Si vous voulez la liste de toutes les branches distantes:git branch -a
À mise à jour branches locales qui permettent de suivre à distance des branches:
Cependant, cela peut être encore insuffisante. Cela ne fonctionne que pour vos branches locales qui permettent de suivre à distance les branches. Pour suivre toutes les branches distantes exécuter cette oneliner AVANT
git pull --all
:TL;DR version
(Il semble que tirer récupère toutes les branches de toutes les télécommandes, mais j'ai toujours chercher d'abord juste pour être sûr.)
Exécution de la première commande uniquement si il y a des branches distantes sur le serveur qui ne sont pas suivis par vos branches locales.
P. S. autant que je sache
git fetch --all
etgit remote update
sont équivalentes.Kamil Szot de commentaire, qui les gens ont trouvé utile.
git checkout -b localname remotename/remotebranch
for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done
parce que votre code créé des branches locales nommé d'origine/branchname et je commençais à "refname" origine/branchname " est ambigu chaque fois que j'y ai fait allusion.git pull --all; for remote in `git branch -r | grep -v \>`; do git branch --track ${remote#origin/} $remote; done
. Le changement des bandes de hors de la TÊTE.for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all
git fetch --all
etgit remote update
Première est que git fetch --tout a été ajoutée dans la v1.6.6. Deuxième fetch --tout va tirer de tous à distance de repos. voir le commit 9c4a036b3 sur github. github.com/git/git/commit/...while read
truc comme celagit branch -r | while read remote; do git branch --track "${remote#origin/}" "$remote"; d
et devis de la variable extensions!for /F %r in ('git branch -r') do ( git branch --track %r) && git fetch --all && git pull --all
origin/
git branch -r
commandes pour trouver toutes les différentes branches. Utilisationgit branch -r --no-color
d'empêcher non valide les noms de branche sur les bornes de soutenir des codes de couleur.git pull --all
juste ne fait rien: "Vous a demandé de se retirer de la distance '--tous", mais ne précise pas une branche"fetch --all
destiné à extraire toutes les télécommandes? au moins, il ne fonctionne pas pour moi (ne pas chercher de nouvelles branches distantes)git pull
seulement se fondre dans la branche courante, même avec--all
. Afin de ne pas mettre à jour d'autres le suivi des branches à côté.git branch -r | grep -v "\->" | foreach {git branch --track $_.Substring($_.IndexOf("/") + 1)}; git pull --all
for remote in $(git branch -r | grep -v -e "\->" -e master); do git branch --track ${remote#origin/} $remote; done
git fetch
suivie par git pull " stackoverflow.com/a/292359/1114926git fetch --all
etgit remote update
sont presque les mêmes. Cependant,git remote update
par défaut récupère la distance spécifiée parremotes.default
. Si ce n'est pas définie (qui, je crois, par défaut, il n'est pas), alors il va chercher tous les. Préférable d'utilisergit fetch --all
que son comportement est cohérent.git config --global alias.fa 'branch -r | grep -v ">" | while read remote; do git branch --track "${remote#origin/}" "$remote"; done'
ne suffit d'afficher git branch définition de commandegit fetch
, explique l'arrière-plan de l'information vraiment très bien, alors maintenant, cette réponse fait sens pour moi. +1!git fetch origin master:master
, par exemple. Cela permet de mettre à jour l'index, sans vérification de branches.À la liste des branches distantes:
git branch -r
Vous pouvez vérifier que les sections locales avec:
git checkout -b LocalName origin/remotebranchname
git checkout remotebranchname
et il fonctionne. quelle est la différence avec votre solution?git checkout remotebranchname
utilisé pour créer un nouveau sans rapport avec branche qui est nommé remotebranchname.fatal: Cannot update paths and switch to branch 'develop' at the same time. Did you intend to checkout 'origin/temp' which can not be resolved as commit?
.C'est le résultat quand je lance réponse script, quel est le problème?git checkout -b LocalName origin/remotebranchname
Vous aurez besoin pour créer des branches locales de suivi à distance des branches.
En supposant que vous avez un seul distant appelé
origin
, cet extrait de code va créer des branches pour tous à distance de suivi:Après,
git fetch --all
sera mise à jour toutes les copies locales des branches distantes.Aussi,
git pull --all
mise à jour de votre local de suivi des branches, mais en fonction de votre région s'engage et comment les "fusionner" option de configuration est défini, il pourrait créer une fusion de commettre, l'avance rapide ou échouer.git pull --all
sera mise à jour tous les locaux de suivi des branches? Aussi loin que je peux dire c'uniquement les mises à jour de la branche courante de toutes les télécommandes.origin
? Voir cette réponse qui fonctionne sur tous les noms distants.Si vous n':
ils seront tous là, à l'échelle locale. Si vous effectuez ensuite:
vous verrez répertorié comme remotes/origin/branche-nom. Depuis qu'ils y sont, localement, vous pouvez faire ce que vous s'il vous plaît avec eux. Par exemple:
ou
ou
--all
)git fetch -all
récupère toutes les branches de toutes les télécommandes.git fetch origin
récupère toutes les branches de la télécommandeorigin
. Le plus tard est ce que l'OP a été demandé.--all
signifie "toutes les télécommandes", pas "toutes les branches de l'un à distance". Ce dernier est sous-entendu par toute extraction à partir d'une télécommande.git branch -r
affiche, cependant.Cela suppose que toutes les branches sont suivis.
Si ils ne sont pas vous pouvez mettre le feu à cette Bash:
Puis exécuter la commande.
->
qui existent dans la sortie degit branch -r
comme " origine/TÊTE -> origin/master`Branch 'origin/quote-filenames' set up to track local branch 'master'.
La sortie désirée est:Branch 'quote-filenames' set up to track remote branch 'quote-filenames' from 'origin'.
C'est arrière, la définition de l'origine de la piste de la télécommande. Voir cette réponse pour un correctif.git fetch
ne fonctionnerait pas. Donc la leçon ici est que vous avez besoin pour le suivi à distance des branches. Gracias!Le Bash
for
boucle ne fonctionnait pas pour moi, mais ce n'est exactement ce que je voulais. Toutes les branches de mon origine en miroir le même nom localement.Voir Mike DuPonts'commentaire ci-dessous. Je pense que j'essayais de le faire sur un Serveur Jenkins qui laisse dans décollement de la mode.
fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository
après un simple clone. Ont pour détacher la tête la première. Je l'ai fait avecgit checkout <SHA>
git checkout --detach # detach the head
et puisgit fetch origin \'+refs/heads/*:refs/heads/*
git clone <repo_URI> .git
juste l'installation d'un nu-pensions sans contenu. Ensuite, exécutez l'OPs de commande:git fetch origin '+refs/heads/*:refs/heads/*
.remote.<remote>.fetch
est un paramètre restrictive.Utilisation
git fetch && git checkout RemoteBranchName
.Il fonctionne très bien pour moi...
origin/branch
; il suffit de dire seulementbranch
).Lorsque vous clonez un dépôt, toutes les informations de branches est effectivement téléchargé mais les branches sont cachés. Avec la commande
vous pouvez afficher toutes les branches du dépôt, et avec la commande
vous pouvez ensuite "télécharger" manuellement un à un.
Cependant, il est beaucoup plus propre et plus rapide, mais c'est un peu compliqué. Vous avez besoin de trois étapes à suivre:
Première étape
créer un nouveau dossier vide sur votre machine et de cloner une copie miroir de l' .git dossier à partir du référentiel:
le référentiel local à l'intérieur du dossier my_repo_folder est toujours vide, il est juste caché .git dossier maintenant que vous pouvez le voir avec un "ls -alt" commande dans le terminal.
Deuxième étape
commutateur de ce référentiel à partir d'un vide (nu) dépôt régulier de dépôt par la commutation de la valeur booléenne "nu" de la git configurations de faux:
Troisième Étape
Saisir tout ce qui à l'intérieur du dossier et de créer toutes les branches sur la machine locale, donc ce qui en fait un normal des pensions.
Alors maintenant, vous pouvez simplement taper la commande
git branch
et vous pouvez voir que toutes les branches sont téléchargés.C'est le moyen rapide dans lequel vous pouvez cloner un dépôt git avec toutes les branches à la fois, mais ce n'est pas quelque chose que vous voulez pour chaque projet de cette manière.
Vous pouvez récupérer toutes les branches par:
ou:
Le
--depth=10000
paramètre peut aider si vous avez shallowed référentiel.De tirer toutes les branches, à l'utilisation:
Si ci-dessus ne fonctionne pas, alors précéder la commande ci-dessus avec:
comme le
remote.origin.fetch
pourrait soutenir qu'une seule branche lors de l'extraction, en particulier lorsque vous cloné votre repo avec--single-branch
. Cochez cette par:git config remote.origin.fetch
.Après cela, vous devriez être en mesure d'extraire n'importe quel branche.
Voir aussi:
À pousser toutes les branches de la télécommande, utilisez:
finalement
--mirror
à miroir de tous les refs.Si votre but est de reproduire un référentiel, voir: La duplication d'un référentiel article sur GitHub.
depth=1
) et la config aussi spécifié d'une branche spécifique pourfetch
- ledepth=1000
paramètre a été le correctif qui m'a aidé à passer à la caisse un distant spécifique de la branchepull --all
ne tirez pas sur toutes les branches, mais toutes les télécommandesJ'ai l'habitude de l'utiliser rien d'autre que des commandes comme ceci:
Un peu plus courte version:
Je crois que vous avez cloné le dépôt par:
Maintenant, allez dans ce dossier à l'aide de cd:
Si vous tapez
git status
vous pouvez voir tous les:Pour voir tous cachés de la branche types:
Il fournira la liste de tous les à distance des branches.
Maintenant, si vous voulez à la caisse sur une branche particulière, tapez simplement:
Si vous êtes ici à la recherche d'une solution pour obtenir toutes les branches et puis tout migrer vers un autre serveur Git, j'ai mis en place les étapes ci-dessous. Si vous voulez juste pour obtenir toutes les branches de mise à jour localement, s'arrêter à la première ligne vide.
git fetch git pull
stackoverflow.com/a/292359/1114926pull
, en effet, faire unfetch
d'abord, mais il est plus facile de dire si le problème est à partir de lafetch
partie depull
ou de lamerge
partie depull
quandfetch
est exécutée indépendamment.Après le clonage de l'référentiel maître, vous ne pouvez exécuter
Assurez-vous que toutes les branches distantes sont fetchable dans
.git/config
fichier.Dans cet exemple, seul le
origin/production
branche est fetchable, même si vous essayez de fairegit fetch --all
rien ne se passera, mais l'extraction de l'production
branche:Cette ligne doit être remplacé par:
Puis exécutez
git fetch
etc...git config --get remote.origin.fetch
et ensuite (destructive) mis:git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
Boucle ne semble pas fonctionner pour moi et je voulais ignorer origin/master.
Voici ce qui a fonctionné pour moi.
Après que:
grep | awk
antipattern:git branch -r | awk -F 'origin/' '!/HEAD|master/{
...Seulement ces trois commandes permet d'obtenir toutes les branches:
pull --all
. Mais si encore nécessaire, puis l'autre réponse ci-dessous, par @Johnno Nola, en supposant que toutes les branches sont suivis, mélangé avec cette réponse, c'est la manière d'aller.J'ai écrit un petit script pour gérer le clonage d'un nouveau repo et les branches pour toutes les branches distantes.
Vous pouvez trouver la dernière version ici:
À utiliser, il suffit de le copier dans votre git répertoire bin (pour moi, c'est
C:\Program Files (x86)\Git\bin\git-cloneall
), puis, sur la ligne de commande:Elle clones comme d'habitude, mais crée local de suivi des branches pour toutes les branches distantes.
Voici quelque chose que je voudrais examiner robuste:
HEAD
pour suivreorigin/HEAD
origin
Il n'est pas nécessaire de
git fetch --all
en passant-all
àgit pull
passe cette option à l'intérieur de lafetch
.De crédit à cette réponse.
Comment Récupérer Toutes les Branches Git Suivi Seule Télécommande.
Cela a été testé et fonctionne sur Red Hat et Git Bash sur Windows 10.
TLDR:
Explication:
L'un liner vérifie et extrait toutes les branches, sauf la TÊTE.
Liste la distance de suivi des branches.
Ignorer la TÊTE.
Prendre le nom de la branche off de la télécommande(s).
Checkout toutes les branches de suivi d'une seule télécommande.
Chercher pour l'extrait de la branche.
Techniquement, l'extraction n'est pas nécessaire pour de nouvelles branches locales.
Ce peut être utilisée soit pour
fetch
oupull
les branches qui sont à la fois nouveaux et des changements de distance(s).Assurez-vous juste que vous ne tirez que si vous êtes prêt à fusionner.
Configuration De Test
Découvrez un référentiel avec SSH URL.
Avant
Vérifier branches locales.
Exécuter Des Commandes
Exécuter le un paquebot.
Après
Vérifier les branches d'activité à distance(s) branches.
Pour les utilisateurs de Windows à l'aide de PowerShell:
git branch -r | ForEach-Object { # Skip default branch, this script assumes # you already checked-out that branch when cloned the repo if (-not ($_ -match " -> ")) { $localBranch = ($_ -replace "^.*?/", "") $remoteBranch = $_.Trim() git branch --track "$localBranch" "$remoteBranch" } }
Voici un Perl version de la one-liner fourni dans l'acceptation réponse:
git branch -r | perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~ /origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file
Vous pouvez exécuter le fichier de sortie comme un script Shell si vous le souhaitez.
Nous avons supprimé de notre Cachette de dépôt de projet par accident. Heureusement que quelqu'un avait créé une fourchette juste avant la perte accidentelle. J'ai cloné la fourche à mon local (va omettre les détails de la façon dont je l'ai fait). Une fois que j'ai eu la fourche entièrement dans mon local, j'ai couru un one-liner. J'ai modifié la distance de l'URL (l'origine dans mon cas) pour pointer vers le référentiel cible, nous avons été récupérer à:
git remote set-url origin <remote-url>
Et enfin poussé toutes les branches à l'origine de la sorte:
git push --all origin
et nous étions de retour dans les affaires.
Nous pouvons mettre de la succursale ou de noms de balise dans un fichier temporaire, puis faire la commande git pull pour chaque nom/tag:
Si vous avez des problèmes avec
fetch --all
puis le suivi de votre branche distante:Pour éviter le message d'erreur " fatal: Une branche nommée 'origin/master' existe déjà.', vous avez besoin de ceci:
En fonction de la réponse par Learath2, voici ce que j'ai fait après avoir fait
git clone [...]
etcd
-ing dans le répertoire créé:git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b
Travaillé pour moi, mais je ne peux pas savoir, il va travailler pour vous. Être prudent.
Maintenant localement votre
yourNewLocalBranchName
est votrerequiredRemoteBranch
.Pour aux Utilisateurs de Visual Studio, Sur la console du Gestionnaire de Package:
branche git | %{ git fetch en amont; git merge en amont/master}
Ont essayé de nombreuses façons, que celle-ci est simple et fonctionne pour moi.
git fetch --all
En utilisant ce commentaire vous pouvez récupérer le code de toutes les branches d'activité qui vous ont ajouté à distance référentiel