J'ai cloné un référentiel Git, qui contient environ cinq branches. Cependant, quand je le fais, git branch
je n'en vois qu'un:
$ git branch
* master
Je sais que je peux faire git branch -a
pour voir toutes les branches, mais comment tirer toutes les branches localement, alors quand je le fais git branch
, cela montre ce qui suit?
$ git branch
* master
* staging
* etc...
git
branch
git-branch
David542
la source
la source
--single-branch
paramètre lors du clonage: stackoverflow.com/questions/17714159/… (git fetch --all
ne fonctionnera jamais si vous n'avez spécifié qu'une seule branche!)git clone --bare <repo url> .git
(remarquez que vous devez ajouter "--bare" et ".git" à la fin pour cloner le dépôt en tant que "nu" repo), puisgit config --bool core.bare false
(positionne le drapeau "nu" sur false), puisgit reset --hard
(déplace le HEAD sur le HEAD actuel du repo). Maintenant, si vousgit branch
voyez toutes les branches du dépôt que vous avez cloné.Réponses:
Vous pouvez récupérer toutes les branches de toutes les télécommandes comme ceci:
C'est essentiellement un mouvement de puissance .
fetch
met à jour les copies locales des succursales distantes, ce qui est toujours sans danger pour vos succursales locales MAIS :fetch
ne mettra pas à jour les succursales locales (qui suivent les succursales distantes); si vous souhaitez mettre à jour vos succursales locales, vous devez toujours tirer toutes les succursales.fetch
ne créera pas de branches locales (qui suivent les branches distantes), vous devez le faire manuellement. Si vous souhaitez répertorier toutes les branches distantes:git branch -a
Pour mettre à jour les branches locales qui suivent les branches distantes:
Cependant, cela peut être encore insuffisant. Cela ne fonctionnera que pour vos succursales locales qui suivent les succursales distantes. Pour suivre toutes les branches distantes, exécutez cet oneliner AVANT
git pull --all
:Version TL; DR
(Il semble que pull récupère toutes les branches de toutes les télécommandes, mais je cherche toujours en premier 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.
PS AFAIK
git fetch --all
etgit remote update
sont équivalents.Commentaire de Kamil Szot , que les gens ont trouvé utile.
la source
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éait des branches locales nommées origine / nom de branche et que je recevais "refname 'origine / nom de branche" est ambigu chaque fois que j'y faisais référence.git pull --all; for remote in `git branch -r | grep -v \>`; do git branch --track ${remote#origin/} $remote; done
. Le changement supprime HEAD.for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all
Pour répertorier les succursales distantes:
git branch -r
Vous pouvez les consulter en tant que succursales locales avec:
git checkout -b LocalName origin/remotebranchname
la source
git checkout remotebranchname
et ça marche. quelle est la différence avec votre solution?git checkout remotebranchname
utilisé pour simplement créer une nouvelle sans rapport avec la branche qui est nommé remotebranchname .Vous devrez créer des succursales locales pour suivre les succursales distantes.
En supposant que vous n'ayez qu'une seule télécommande appelée
origin
, cet extrait de code créera des branches locales pour toutes celles à distance:Après cela,
git fetch --all
mettra à jour toutes les copies locales des branches distantes.En outre,
git pull --all
mettra à jour vos branches de suivi locales, mais en fonction de vos validations locales et de la façon dont l'option de configuration «fusion» est définie, elle peut créer une validation de fusion, une avance rapide ou un échec.la source
git pull --all
mettre à jour toutes les succursales de suivi locales? Pour autant que je sache, il ne met à jour que la branche actuelle de toutes les télécommandes.origin
? Voir cette réponse qui fonctionnera sur tous les noms distants.Si tu fais:
alors ils seront tous là sur place. Si vous effectuez ensuite:
vous les verrez répertoriés comme télécommandes / origine / nom de branche. Puisqu'ils sont là localement, vous pouvez faire tout ce que vous voulez avec eux. Par exemple:
ou
ou
la source
--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 dernier est ce que le PO demandait.--all
signifie "toutes les télécommandes", pas "toutes les branches d'une télécommande donnée". Cette dernière est impliquée par toute extraction depuis une télécommande.Cela suppose que toutes les branches sont suivies.
Si ce n'est pas le cas, vous pouvez déclencher ceci dans Bash:
Exécutez ensuite la commande.
la source
->
laquelle existera probablement dans la sortie degit branch -r
`origin / HEAD -> origin / master`Branch 'origin/quote-filenames' set up to track local branch 'master'.
La sortie souhaitée est:Branch 'quote-filenames' set up to track remote branch 'quote-filenames' from 'origin'.
C'est à l' envers , en définissant l'origine pour suivre la télécommande. Voir cette réponse pour un correctif.git fetch
ne fonctionnerais pas. Donc, la leçon ici est que vous devez suivre les branches distantes. Gracias!La
for
boucle Bash ne fonctionnait pas pour moi, mais cela faisait exactement ce que je voulais. Toutes les branches de mon origine reflétaient localement le même nom.Voir le commentaire de Mike DuPont ci-dessous. Je pense que j'essayais de le faire sur un serveur Jenkins qui le laisse en mode tête détachée.
la source
fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository
après un simple clone. Doit détacher la tête en premier. Je l'ai fait avecgit checkout <SHA>
git checkout --detach # detach the head
et ensuitegit fetch origin \'+refs/heads/*:refs/heads/*
Utilisez
git fetch && git checkout RemoteBranchName
.Cela fonctionne très bien pour moi ...
la source
origin/branch
; il suffit de dire seulementbranch
).Lorsque vous clonez un référentiel, toutes les informations des branches sont réellement téléchargées mais les branches sont masquées. Avec la commande
vous pouvez afficher toutes les branches du référentiel, et avec la commande
vous pouvez ensuite les "télécharger" manuellement un par un.
Cependant, il existe un moyen beaucoup plus propre et plus rapide, bien que ce soit un peu compliqué. Pour ce faire, vous avez besoin de trois étapes:
Premier pas
créez un nouveau dossier vide sur votre ordinateur et clonez une copie miroir du dossier .git à partir du référentiel:
le dépôt local à l'intérieur du dossier my_repo_folder est toujours vide, il y a juste un dossier .git caché que vous pouvez voir avec une commande "ls -alt" du terminal.
Deuxième étape
basculez ce référentiel d'un référentiel vide (nu) vers un référentiel normal en basculant la valeur booléenne "bare" des configurations git sur false:
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.
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 référentiel git avec toutes les branches à la fois, mais ce n'est pas quelque chose que vous voulez faire pour chaque projet de cette façon.
la source
Vous pouvez récupérer toutes les branches en:
ou:
Le
--depth=10000
paramètre peut aider si vous avez un référentiel superficiel.Pour tirer toutes les branches, utilisez:
Si ci-dessus ne fonctionne pas, faites précéder la commande ci-dessus par:
car 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 dépôt avec--single-branch
. Vérifiez cela par:git config remote.origin.fetch
.Après cela, vous devriez pouvoir commander n'importe quelle succursale.
Voir également:
Pour pousser toutes les branches vers la télécommande, utilisez:
éventuellement
--mirror
pour refléter toutes les références.Si votre objectif est de dupliquer un référentiel, voir: Dupliquer un article de référentiel sur GitHub.
la source
depth=1
) et la configuration a également spécifié une branche spécifique pourfetch
- ledepth=1000
paramètre était le correctif qui m'a aidé à extraire une branche distante spécifiquepull --all
ne tire pas toutes les branches, mais toutes les télécommandesJ'utilise habituellement rien d'autre que des commandes comme celle-ci:
Une version un peu plus courte:
la source
Je pense que vous avez cloné le référentiel en:
Maintenant, allez dans ce dossier en utilisant cd:
Si vous tapez,
git status
vous pouvez tout voir:Pour voir tous les types de branche cachés:
Il répertorie toutes les branches distantes.
Maintenant, si vous souhaitez commander sur une branche particulière, tapez simplement:
la source
Si vous cherchez ici une solution pour obtenir toutes les branches puis migrer le tout vers un autre serveur Git, j'ai mis en place le processus ci-dessous. Si vous souhaitez simplement mettre à jour toutes les branches localement, arrêtez-vous à la première ligne vide.
la source
git fetch git pull
stackoverflow.com/a/292359/1114926pull
fait en effet unefetch
première mais il est plus facile de dire si le problème vient de lafetch
partiepull
ou de lamerge
partie suivante depull
quandfetch
est exécuté indépendamment.Après avoir cloné le référentiel maître, vous pouvez simplement exécuter
la source
Assurez-vous que toutes les branches distantes sont récupérables dans un
.git/config
fichier.Dans cet exemple, seule la
origin/production
branche est récupérable, même si vous essayez de negit fetch --all
rien faire, mais récupérer laproduction
branche:Cette ligne doit être remplacée par:
Exécutez ensuite
git fetch
etc ...la source
git config --get remote.origin.fetch
puis pour (destructivement) le régler:git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
Le bouclage ne semblait pas fonctionner pour moi et je voulais ignorer origine / master. Voici ce qui a fonctionné pour moi.
Après ça:
la source
grep | awk
antimodèle :git branch -r | awk -F 'origin/' '!/HEAD|master/{
...Juste ces trois commandes obtiendront toutes les branches:
la source
pull --all
. Mais si toujours nécessaire, l'autre réponse ci-dessous, par @Johnno Nola, en supposant que toutes les branches sont suivies, mélangées à cette réponse, est la voie à suivre.Pourquoi personne ne répond à la question des gars et explique ce qui se passe?
Suivez toutes les succursales distantes:
Suivez toutes les branches qui existent dans le référentiel distant.
Faites-le manuellement:
Vous devez remplacer
<branch>
par une branche qui est affichée à partir de la sortie degit branch -r
.Faites-le avec un script bash
Mettez à jour les informations sur les succursales distantes sur votre ordinateur local:
Cela récupère les mises à jour sur les branches du référentiel distant que vous suivez dans votre référentiel local. Cela ne modifie pas vos succursales locales. Votre dépôt git local est maintenant au courant des événements qui se sont produits sur les succursales de dépôt distantes. Un exemple serait qu'un nouveau commit a été poussé vers le maître distant, faire une extraction vous avertira maintenant que votre maître local est en retard de 1 commit.
Mettez à jour les informations sur les succursales distantes sur votre ordinateur local et mettez à jour les succursales locales:
Effectue une extraction suivie d'une fusion pour toutes les branches de la branche distante vers la branche locale. Un exemple serait qu'un nouveau commit a été poussé vers le maître distant, faire un pull mettra à jour votre référentiel local sur les changements dans la branche distante puis il fusionnera ces changements dans votre branche locale. Cela peut créer beaucoup de dégâts en raison de conflits de fusion.
la source
J'ai écrit un petit script pour gérer le clonage d'un nouveau dépôt et créer des branches locales pour toutes les branches distantes.
Vous pouvez trouver la dernière version ici :
Pour l'utiliser, copiez-le simplement dans votre répertoire git bin (pour moi, c'est
C:\Program Files (x86)\Git\bin\git-cloneall
), puis, sur la ligne de commande:Il clone comme d'habitude, mais crée des branches de suivi locales pour toutes les branches distantes.
la source
Comment récupérer toutes les branches Git en suivant une seule télécommande.
Cela a été testé et fonctionne sur Red Hat et Git Bash sur Windows 10.
TLDR:
Explication:
La doublure vérifie puis récupère toutes les branches sauf HEAD.
Répertoriez les branches de suivi à distance.
Ignorez HEAD.
Retirez le nom de la branche de la ou des télécommandes.
Vérifiez toutes les succursales qui suivent une seule télécommande.
Récupérer pour la branche extraite.
Techniquement, l'extraction n'est pas nécessaire pour les nouvelles succursales locales.
Cela peut être utilisé soit pour
fetch
oupull
succursales qui sont toutes les deux nouvelles et qui ont des changements dans les télécommandes.Assurez-vous de ne tirer que si vous êtes prêt à fusionner.
Configuration du test
Découvrez un référentiel avec l'URL SSH.
Avant
Vérifiez les succursales locales.
Exécuter des commandes
Exécutez le liner.
Après
Vérifiez que les succursales locales incluent les succursales distantes.
la source
Pour les utilisateurs de Windows utilisant PowerShell:
la source
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 quelque chose que je considérerais comme robuste:
HEAD
à jour pour suivreorigin/HEAD
origin
Il n'est pas nécessaire de
git fetch --all
passer à-all
pourgit pull
passer cette option à l'internefetch
.Merci à cette réponse .
la source
Voici une version Perl du one-liner fournie dans la réponse acceptée:
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 en tant que script Shell si vous le souhaitez.
Nous avons supprimé notre référentiel de projets Stash par accident. Heureusement, quelqu'un avait créé une fourchette juste avant la perte accidentelle. J'ai cloné la fourchette à mon local (j'oublierai les détails de la façon dont j'ai fait ça). Une fois que j'ai eu la fourche complètement dans mon local, j'ai couru un one-liner. J'ai modifié l'URL de la télécommande (origine dans mon cas) pour pointer vers le référentiel cible vers lequel nous récupérons:
git remote set-url origin <remote-url>
Et finalement poussé toutes les branches à l'origine comme ceci:
git push --all origin
et nous étions de retour dans les affaires.
la source
Nous pouvons mettre tous les noms de branches ou de balises dans un fichier temporaire, puis faire git pull pour chaque nom / balise:
la source
Si vous avez des problèmes avec
fetch --all
alors suivez votre branche distante:la source
Pour éviter le message d'erreur 'fatal: une branche nommée' origin / master 'existe déjà.', Vous avez besoin de ceci:
la source
Sur la base de la réponse de 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
A fonctionné pour moi mais je ne peux pas savoir que cela fonctionnera pour vous. Faites attention.
la source
Maintenant, localement, votre
yourNewLocalBranchName
est votrerequiredRemoteBranch
.la source
Pour les utilisateurs de Visual Studio, sur la console du gestionnaire de packages:
branche git | % {git fetch en amont; git merge upstream / master}
la source
J'ai essayé de nombreuses façons, seule celle-ci est simple et fonctionne pour moi.
la source
Définir l'alias: (basé sur la première réponse)
Maintenant, pour suivre toutes les branches:
git track-all-branches
la source