Comment récupérer toutes les branches Git

j'ai cloné un dépôt Git, qui contient environ cinq branches. Cependant, quand je fais git branch Je ne vois qu'un seul d'entre eux:

$ git branch
* master

je sais que je peux faire git branch -a pour voir toutes les branches, mais comment tirerais-je toutes les branches localement ainsi quand je fais git branch , il montre ce qui suit?

$ git branch
* master
* staging
* etc...
978
demandé sur Peter Mortensen 2012-04-25 13:05:26
la source

22 ответов

vous pouvez récupérer une branche de tous les télécommandes comme ceci:

git fetch --all

fetch met à jour les copies locales des branches éloignées afin que ce soit toujours sûr pour vos branches locales mais :

  1. fetch ne sera pas mise à jour branches locales (qui piste branches distantes); Si vous souhaitez mettre à jour vos branches locales vous avez encore besoin de tirez chaque branche.

  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

À mise à jour branches locales qui permettent de suivre à distance les branches:

git pull --all

Cependant, cela peut être encore insuffisantes. Il ne fonctionnera que pour vos branches locales qui tracent les branches éloignées. Pour suivre toutes les branches distantes, exécutez ce oneliner 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 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)

N'exécute la première commande que s'il y a des branches distantes sur le serveur qui ne sont pas suivis par vos filiales locales.

P.S. AFAIK git fetch --all et git remote update sont équivalents.



de Kamil Szot "comment , que 74 (au moins) personnes ont trouvé utile.

j'ai dû 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'ai été faire "refname' origin/branchname' est ambigu chaque fois que je visée à elle.

1310
répondu Wookie88 2018-08-31 22:04:49
la source

pour lister les branches distantes:

git branch -r

vous pouvez les vérifier en tant que succursales locales avec:

git checkout -b LocalName origin/remotebranchname

447
répondu Learath2 2017-10-26 23:33:37
la source

vous aurez besoin de créer des branches locales en traçant les branches distantes.

en supposant que vous n'avez qu'une seule télécommande appelée origin , cet extrait va créer des branches locales pour toutes les télécommandes de suivi:

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

après cela, git fetch --all mettra à jour toutes les copies locales des branches distantes.

aussi, git pull --all mettra à jour vos branches de suivi locales, mais en fonction de votre l'option configure' merge ' est définie.elle peut créer une propagation de la fusion, une progression rapide ou un échec.

162
répondu Michael Renner 2018-03-28 18:52:59
la source

si vous le faites:

git fetch origin

alors ils seront tous là-bas localement. Si vous exécutez alors:

git branch -a

vous les verrez listés comme remotes/origin/branch-name. Puisqu'ils sont là-bas localement, vous pouvez faire tout 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
99
répondu GoZoner 2013-03-29 23:46:40
la source
$ git remote update
$ git pull --all

cela suppose que toutes les succursales sont suivies.

si ce n'est pas le cas, vous pouvez tirer à Bash:

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

lancez la commande.

44
répondu Johnno Nolan 2018-08-31 22:06:41
la source

utiliser git fetch && git checkout RemoteBranchName .

ça marche très bien pour moi...

36
répondu Regis Zaleman 2018-08-31 22:20:02
la source

le bash pour loop ne marchait pas pour moi, mais ça a fait exactement ce que je voulais. Toutes les branches de mon origine mirrored comme le même nom localement.

git checkout --detach
git fetch origin '+refs/heads/*:refs/heads/*'

Édité: Voir Mike DuPont commentaire ci-dessous. Je pense que j'essayais de faire ça sur un serveur Jenkins qui le laisse en mode tête détachée.

28
répondu Tim Lum 2018-09-05 01:46:31
la source

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

$ git branch -a

, vous pouvez afficher toutes les branches du dépôt, et avec la commande

$ git checkout -b branchname origin/branchname

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


cependant, il y a un moyen beaucoup plus propre et plus rapide, bien que ce soit un peu compliqué. Vous il faut trois étapes pour y parvenir:

  1. premier pas

    créez un nouveau dossier vide sur votre machine et clonez une copie miroir du .dossier git du dépôt:

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

    le dépôt local dans le dossier my_repo_folder est toujours vide, il n'y a qu'un dépôt caché .dossier git maintenant que vous pouvez voir avec une commande "ls-alt" depuis le terminal.

  2. Deuxième étape

    basculer ce dépôt d'un dépôt vide (nu) vers un dépôt régulier en changeant la valeur booléenne "bare" des configurations git en false:

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

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

    $ git reset --hard
    

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

C'est le moyen rapide par 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 faire pour chaque projet de cette façon.

26
répondu FedericoCapaldo 2015-12-06 23:32:58
la source

Je n'utilise habituellement 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
répondu marioosh 2016-04-26 21:36:38
la source

, Vous pouvez récupérer toutes les branches:

git fetch --all

ou:

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

le paramètre --depth=10000 peut vous être utile si vous avez un dépôt peu profond.


pour tirer toutes les branches, utilisez:

git pull --all

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

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

comme le remote.origin.fetch pourrait soutenir seulement une branche spécifique tout en fetching, surtout quand vous cloné votre pension avec --single-branch . Vérifier cela par: git config remote.origin.fetch .

après cela, vous devriez être en mesure de vérifier n'importe quelle succursale.

voir aussi:


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

git push --all

finalement --mirror miroir de tous les refs.


si votre but est de dupliquer un dépôt, voir: duplication d'un dépôt article sur GitHub.

18
répondu kenorb 2017-11-13 20:03:57
la source

si vous êtes ici à la recherche d'une solution pour obtenir toutes les branches et ensuite tout migrer vers un autre serveur Git, j'ai mis en place le processus ci-dessous. Si vous voulez 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  " " "origin/"}' | xargs -L 1 git branch -f --track 
git fetch --all --prune --tags
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>
13
répondu ingyhere 2018-08-08 05:48:34
la source

je crois que vous avez cloner le dépôt par

git clone https://github.com/pathOfrepository

maintenant, allez dans ce dossier en utilisant cd

cd pathOfrepository

si vous tapez git status

vous pouvez voir tous les

   On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

pour voir tous cachés de la branche de type

 git branch -a

il énumérera toute la branche distante

maintenant si vous voulez vérifier sur une branche particulière tapez juste

git checkout -b localBranchName origin/RemteBranchName
11
répondu Abhinav bhardwaj 2018-09-04 14:42:29
la source

après avoir cloné le dépôt principal, vous pouvez juste exécuter

git fetch && git checkout <branchname>
9
répondu Davidacce 2015-05-13 14:43:56
la source

assurez-vous que toutes les branches distantes sont récupérables dans le fichier .git/config .

dans cet exemple, seule la branche origin/production est récupérable, même si vous essayez de faire git fetch --all il ne se passera rien d'autre que de récupérer la branche production :

[origin]
fetch = +refs/heads/production:refs/remotes/origin/production

cette ligne doit être remplacée par:

[origin]
fetch = +refs/heads/*:refs/remotes/origin/*

puis exécuter git fetch etc...

8
répondu Ahmad 2017-09-19 11:43:21
la source

Looping ne semblait pas fonctionner pour moi et je voulais ignorer origine/maître. Voici ce qui a fonctionné pour moi.

git branch -r | grep -v HEAD | awk -F'/' '{print  " " "/"}' | xargs -L 1 git branch -f --track

après cela:

git fetch --all
git pull --all
7
répondu poxion 2013-12-04 09:09:33
la source

juste ces 3 commandes obtiendront toutes les branches

git clone --mirror repo.git  .git     (gets just .git  - bare repository)

git config --bool core.bare false         

git reset --hard                  
5
répondu Izabela Skibinska 2015-08-27 04:46:34
la source

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 :

#!/bin/bash

# Clones as usual but creates local tracking branches for all remote branches.
# To use, copy this file into the same directory your git binaries are (git, git-flow, git-subtree, etc)

clone_output=$((git clone "[email protected]" ) 2>&1)
retval=$?
echo $clone_output
if [[ $retval != 0 ]] ; then
    exit 1
fi
pushd $(echo $clone_output | head -1 | sed 's/Cloning into .\(.*\).\.\.\.//') > /dev/null 2>&1
this_branch=$(git branch | sed 's/^..//')
for i in $(git branch -r | grep -v HEAD); do
  branch=$(echo $i | perl -pe 's/^.*?\///')
  # this doesn't have to be done for each branch, but that's how I did it.
  remote=$(echo $i | sed 's/\/.*//')
  if [[ "$this_branch" != "$branch" ]]; then
      git branch -t $branch $remote/$branch
  fi
done
popd > /dev/null 2>&1

pour l'utiliser, Copiez-le dans votre répertoire git bin (pour moi, c'est C:\Program Files (x86)\Git\bin\git-cloneall ), puis, sur la ligne de commande:

git cloneall [standard-clone-options] <url>

il clone comme d'habitude, mais crée des branches locales de suivi pour toutes les branches distantes.

4
répondu tstone2077 2016-03-28 22:22:23
la source

pour les utilisateurs de Windows utilisant 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"
    }
}
git fetch --all
git pull --all
2
répondu kiewic 2017-07-16 02:43:09
la source

nous pouvons mettre tous les noms de branche ou d'étiquette dans un fichier temporaire, puis faire git pull pour chaque nom / étiquette:

git branch -r | grep origin | grep -v HEAD| awk -F/ '{print $NF}' > /tmp/all.txt
git tag -l >> /tmp/all.txt
for tag_or_branch in `cat /tmp/all.txt`; do git checkout $tag_or_branch; git pull origin $tag_or_branch; done
1
répondu anhlc 2016-07-05 07:32:19
la source

voici quelque chose que je considérerais comme robuste:

  • N'a pas de mise à jour de suivi à distance pour les branches
  • N'essaie pas de mettre à jour HEAD pour suivre origin/HEAD
  • permet les télécommandes nommées autrement que origin
  • coque correctement Citée
for b in $(git branch -r --format='%(refname:short)'); do
  [[ "${b#*/}" = HEAD ]] && continue
  git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
done
git pull --all

il n'est pas nécessaire de git fetch --all comme passer -all à git pull passes cette option à l'interne fetch .

Crédit cette réponse .

1
répondu Tom Hale 2018-09-14 19:08:11
la source

basé sur la réponse de Learath2, voici ce que j'ai fait après avoir fait git clone [...] et cd - ing dans le répertoire créé:

git branch -r | grep -v master | awk {print$1} | sed 's/^origin\/\(.*\)$/ &/' | xargs -n2 git checkout -b

a marché pour moi, mais je ne sais pas si ça marchera pour toi. Être prudent.

0
répondu erikano 2015-07-02 18:23:33
la source
git remote add origin https://yourBitbucketLink

git fetch origin

git checkout -b yourNewLocalBranchName origin/requiredRemoteBranch (use tab :D)

Maintenant localement votre yourNewLocalBranchName est votre requiredRemoteBranch .

0
répondu chhotu sardar 2016-08-19 12:20:49
la source

Autres questions sur git branch git-branch