532 votes

Peut « git pull--tous les » mettre à jour toutes mes branches locales ?

J'ai souvent au moins 3 branches distantes: maître, de production et de transfert. J'ai 3 branches locales que de suivi de ces télécommandes.

La mise à jour de tous mes branches locales est fastidieux:

git fetch --all
git rebase origin/master
git co staging
git rebase origin/staging
git co production
git rebase origin/production

J'aimerais être capable de faire un "git pull", mais je n'ai pas été en mesure de l'obtenir pour fonctionner. Il semble faire un "fetch --tous", puis mises à jour (avance rapide ou de fusion) de la branche courante, mais pas les autres branches locales.

Je suis toujours bloqué de passer manuellement à chaque section locale et la mise à jour.

226voto

John Points 9709

git-up automatise ce. Depuis le README:

Donc, git pull fusionne par défaut, si il devrait vraiment rebase. Vous pouvez lui demander de rebase automatiquement à la place, mais il persiste à ne pas toucher à rien d'autre qu'actuellement extrait de la branche. Si vous effectuez le suivi d'un tas de branches distantes, vous aurez non-avance rapide des plaintes prochaine fois que vous poussez.

Résoudre une fois pour toutes:

gem install git-up

209voto

Jefromi Points 127932

Le comportement que vous décrivez pull --all est exactement comme prévu, mais pas forcément utile. L'option est passée à git fetch, qui extrait toutes les références de toutes les télécommandes, au lieu d'un seul; pull fusionne (ou dans votre cas, rebases) la seule branche.

Si vous souhaitez consulter d'autres branches, vous allez avoir à le consulter. Et oui, la fusion (et complet) absolument exiger un arbre, de sorte qu'ils ne peuvent pas être fait sans vérifier les autres branches. Vous pouvez rassembler vos décrit les étapes à un script/alias si vous le souhaitez, mais je vous suggère de rejoindre les commandes avec && , de sorte que si l'un d'eux échoue, il ne sera pas essayer de labourer les champs.

49voto

muhqu Points 2828

Remarque: Même si j'ai posté ma propre solution, je vous conseille d'utiliser git-up, qui est également accepté de répondre.


Je sais que cette question est de presque 3 ans, mais je me suis posé la même question et n'a pas trouvé tout prêt de solution toute faite. Donc, j'ai créé une coutume commande git script shell de mon auto.

Ici ça va, l' git-ffwd-update script effectue les tâches suivantes...

  1. il émet un git remote update d'extraire le lates tours
  2. puis utilise git remote show pour obtenir une liste des succursales locales de la piste une branche distante (par exemple les agences qui peuvent être utilisés avec git pull)
  3. elle vérifie ensuite avec git rev-list --count <REMOTE_BRANCH>..<LOCAL_BRANCH> combien d'engager la succursale locale est derrière la télécommande (à l'avance et vice versa)
  4. si la branche locale est de 1 ou plus s'engage à l'avance, il peut ne PAS être en avance rapide et doit être fusionnées ou relocalisée à la main
  5. si la branche locale est 0 s'engage à l'avance et 1 ou plus s'engage derrière, il peut être rapidement acheminés par git branch -l -f <LOCAL_BRANCH> -t <REMOTE_BRANCH>

le script peut être appelé comme:

$ git ffwd-update
Fetching origin
 branch bigcouch was 10 commit(s) behind of origin/bigcouch. reseting local branch to remote
 branch develop was 3 commit(s) behind of origin/develop. reseting local branch to remote
 branch master is 6 commit(s) behind and 1 commit(s) ahead of origin/master. could not be fast-forwarded

Le script complet, doit être enregistré en tant que git-ffwd-update et doit être sur le qui - PATH.

#!/bin/bash

main() {
  REMOTES="$@";
  if [ -z "$REMOTES" ]; then
    REMOTES=$(git remote);
  fi
  REMOTES=$(echo "$REMOTES" | xargs -n1 echo)
  CLB=$(git branch -l|awk '/^\*/{print $2}');
  echo "$REMOTES" | while read REMOTE; do
    git remote update $REMOTE
    git remote show $REMOTE -n \
    | awk '/merges with remote/{print $5" "$1}' \
    | while read line; do
      RB=$(echo "$line"|cut -f1 -d" ");
      ARB="refs/remotes/$REMOTE/$RB";
      LB=$(echo "$line"|cut -f2 -d" ");
      ALB="refs/heads/$LB";
      NBEHIND=$(( $(git rev-list --count $ALB..$ARB 2>/dev/null) +0));
      NAHEAD=$(( $(git rev-list --count $ARB..$ALB 2>/dev/null) +0));
      if [ "$NBEHIND" -gt 0 ]; then
        if [ "$NAHEAD" -gt 0 ]; then
          echo " branch $LB is $NBEHIND commit(s) behind and $NAHEAD commit(s) ahead of $REMOTE/$RB. could not be fast-forwarded";
        elif [ "$LB" = "$CLB" ]; then
          echo " branch $LB was $NBEHIND commit(s) behind of $REMOTE/$RB. fast-forward merge";
          git merge -q $ARB;
        else
          echo " branch $LB was $NBEHIND commit(s) behind of $REMOTE/$RB. reseting local branch to remote";
          git branch -l -f $LB -t $ARB >/dev/null;
        fi
      fi
    done
  done
}

main $@

25voto

larsmans Points 167484

Il n’est pas si difficile à automatiser :

20voto

Matt Connolly Points 4851

Ce n'est toujours pas automatique, et que je souhaite qu'il y avait une option pour - et il devrait y avoir des contrôles pour s'assurer que cela ne peut se faire pour avancer rapidement les mises à jour (c'est pourquoi manuellement en faisant un pull est beaucoup plus sûr!!), mais les mises en garde de côté, vous pouvez:

git fetch origin
git update-ref refs/heads/other-branch origin/other-branch

pour mettre à jour la position de votre branche locale sans avoir à le vérifier.

Remarque: vous fera perdre votre actuelle direction de la position et de la déplacer à l'endroit où l'origine de la branche est, ce qui signifie que si vous avez besoin de fusionner, vous risquez de perdre des données!

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