J'ai souvent au moins 3 agences distantes: master, staging et production. J'ai 3 succursales locales qui suivent ces succursales distantes.
La mise à jour de toutes mes succursales locales est fastidieuse:
git fetch --all
git rebase origin/master
git checkout staging
git rebase origin/staging
git checkout production
git rebase origin/production
J'adorerais pouvoir simplement faire un "git pull -all", mais je n'ai pas réussi à le faire fonctionner. Il semble faire un "fetch --all", puis met à jour (avance rapide ou fusionne) la branche de travail actuelle, mais pas les autres branches locales.
Je suis toujours bloqué en passant manuellement à chaque branche locale et en mettant à jour.
Réponses:
Le comportement que vous décrivez
pull --all
est exactement comme prévu, mais pas nécessairement utile. L'option est transmise à git fetch, qui récupère ensuite toutes les références de toutes les télécommandes, au lieu de seulement celle nécessaire;pull
fusionne ensuite (ou dans votre cas, rebase) la branche unique appropriée.Si vous souhaitez consulter d'autres succursales, vous devrez les consulter. Et oui, la fusion (et le rebasage) nécessite absolument un arbre de travail, donc ils ne peuvent pas être effectués sans vérifier les autres branches. Vous pouvez encapsuler vos étapes décrites dans un script / alias si vous le souhaitez, bien que je suggère de joindre les commandes
&&
afin que si l'une d'entre elles échoue, elle n'essaiera pas de continuer.la source
J'utilise la
sync
sous - commande de hub pour automatiser cela. J'aialias git=hub
dans mon.bash_profile
, donc la commande que je tape est:Cela met à jour toutes les branches locales qui ont une branche amont correspondante. Depuis la page de manuel:
Il gère également le stockage / le retrait des modifications non validées sur la branche actuelle.
J'avais l'habitude d'utiliser un outil similaire appelé git-up , mais il n'est plus maintenu et
git sync
fait presque exactement la même chose.la source
git config --global git-up.rebase.auto false
.Je sais que cette question a presque 3 ans, mais je me suis posé la même question et je n'ai trouvé aucune solution toute faite. J'ai donc créé moi-même un script shell de commande git personnalisé.
Ça y est, le
git-ffwd-update
script fait ce qui suit ...git remote update
pour récupérer les derniers toursgit remote show
pour obtenir une liste des branches locales qui suivent une branche distante (par exemple les branches qui peuvent être utilisées avecgit pull
)git rev-list --count <REMOTE_BRANCH>..<LOCAL_BRANCH>
le nombre de validations de la branche locale derrière la télécommande (et vice versa)git branch -f <LOCAL_BRANCH> -t <REMOTE_BRANCH>
le script peut être appelé comme:
Le script complet, doit être enregistré en tant que
git-ffwd-update
et doit être sur lePATH
.la source
git branch
appel. J'ai supprimé le -l pour changer l'appelgit branch -f $LB -t $ARB >/dev/null;
et maintenant le script fonctionne comme il se doit.Ce n'est pas si difficile à automatiser:
la source
git rebase origin/$branch
pourgit pull
, afin qu'il récupère à partir de la branche de suivi appropriée (vraisemblablement à l'origine) et soit fusionner ou rebaser comme déterminé par la configuration.fetch
. Avoir édité; fonctionnalités supplémentaires / corrections tout ce qui dépend de l'OP.pull
(ou vérifierbranch.<branch>.rebase
), afin de ne pas rebaser accidentellement une branche qui est configurée pour tirer normalement (fusionner).set -e
au lieu de|| exit 1
pour faire quitter l'interpréteur à la première erreur.Ce n'est toujours pas automatique, car je souhaite qu'il y ait une option pour - et il devrait y avoir une vérification pour s'assurer que cela ne peut se produire que pour les mises à jour à avance rapide (c'est pourquoi faire un pull manuellement est beaucoup plus sûr !!), mais mises à part, vous pouvez:
pour mettre à jour la position de votre succursale locale sans avoir à la vérifier.
Remarque: vous perdrez votre position de branche actuelle et la déplacerez à l'endroit où se trouve la branche d'origine, ce qui signifie que si vous devez fusionner, vous perdrez des données!
la source
git fetch origin other-branch:other-branch
Il y a beaucoup de réponses ici mais aucune qui permet
git-fetch
de mettre à jour la référence locale directement, ce qui est beaucoup plus simple que de vérifier les branches et plus sûr quegit-update-ref
.Ici, nous utilisons
git-fetch
pour mettre à jour les branches non actuelles etgit pull --ff-only
pour la branche actuelle. Il:et le voici:
Depuis la page de manuel de
git-fetch
:En spécifiant
git fetch <remote> <ref>:<ref>
(sans aucun+
), nous obtenons une extraction qui met à jour la référence locale uniquement lorsqu'elle peut être expédiée rapidement.Remarque : cela suppose que les branches locales et distantes sont nommées de la même manière (et que vous souhaitez suivre toutes les branches), cela devrait vraiment utiliser des informations sur les branches locales que vous avez et sur ce qu'elles sont configurées pour suivre.
la source
c*n
étapes (au lieu de 1), où sec
trouve un certain nombre de commandes répétées etn
le nombre de branches.git branch -r | grep -v ' -> ' | while read remotebranch
pourgit branch -r | grep -v ' -> ' | grep -f <(git branch | cut -c 3- | awk '{print "\\S*/"$0"$"}') | while read remotebranch
la limiter aux branches , je l' ai déjà sur place. J'ai également ajouté ungit fetch --prune
au début pour mettre à jour la liste des branches distantes avant de faire quoi que ce soit, ce qui évite certains avertissements.Ce problème n'est pas résolu (encore), du moins pas facilement / sans script: voir ce post sur la liste de diffusion git par Junio C Hamano expliquant la situation et appelant à une solution simple.
Le raisonnement principal est que vous ne devriez pas en avoir besoin:
L'appel à une solution était pour une option ou un script externe pour élaguer les branches locales qui suivent maintenant les branches de suivi à distance, plutôt que de les garder à jour par avance rapide, comme l'affiche originale demandée.
Remarque: à partir de git 2.10, aucune solution de ce type n'existe. Notez que la
git remote prune
sous-commande, etgit fetch --prune
concerne la suppression de la branche de suivi à distance pour la branche qui n'existe plus sur la télécommande, pas la suppression de la branche locale qui suit la branche de suivi à distance (pour laquelle la branche de suivi à distance est la branche en amont).la source
Il y a beaucoup de réponses acceptables ici, mais une partie de la plomberie peut être un peu opaque pour les non-initiés. Voici un exemple beaucoup plus simple qui peut facilement être personnalisé:
Si vous ajoutez
~/bin/git
à votrePATH
(en supposant que le fichier l'est~/bin/git/git-update-all
), vous pouvez simplement exécuter:la source
Ajoutez ce script à
.profile
sur Mac OS X:la source
Voici une bonne réponse: Comment récupérer toutes les branches git
la source
git fetch
etgit pull
, au lieu de justegit pull
?origin/
préfixeUn script que j'ai écrit pour mon GitBash . Accomplit ce qui suit:
git checkout branch
git pull origin
** J'utilise ceci mais je n'ai pas testé à fond, utilisez à vos risques et périls. Voir un exemple de ce script dans un fichier .bash_alias ici .
la source
Si vous êtes sous Windows, vous pouvez utiliser PyGitUp qui est un clone de
git-up
Python. Vous pouvez l'installer en utilisant pip avecpip install --user git-up
ou via Scoop en utilisantscoop install git-up
[
la source
Il suffit de poster une réponse mise à jour.
git-up
n'est plus maintenu et si vous lisez la documentation, ils mentionnent que la fonctionnalité est maintenant disponible dans git .Vous pouvez également définir cela pour tous à
git pull
partir de Git 2.9 (merci @VonC, veuillez voir sa réponse ici )la source
git-up
documentation parce qu'ils ne mentionnent pas quegit-up
.git-up
:)Je suis tombé sur le même numéro de cette question ...
Je me demandais à ce sujet, j'ai fait une petite fonction d'alias dans mon
.bashrc
fichier:A travaillé pour moi (:
la source
Si les références / têtes / maître peuvent être transférées rapidement vers les références / télécommandes / foo / master , la sortie de
devrait retourner l'id SHA1 vers lequel se réfèrent / se dirigent / se dirigent les points. Avec cela, vous pouvez créer un script qui met automatiquement à jour toutes les branches locales auxquelles aucun commit de déviation ne leur a été appliqué.
Ce petit script shell (je l'ai appelé git-can-ff ) illustre comment cela peut être fait.
la source
Pour compléter la réponse de Matt Connolly, il s'agit d'un moyen plus sûr de mettre à jour les références de succursales locales qui peuvent être transmises rapidement, sans vérifier la succursale. Il ne met pas à jour les branches qui ne peuvent pas être avancées rapidement (c'est-à-dire qui ont divergé), et il ne met pas à jour la branche actuellement extraite (car alors la copie de travail doit également être mise à jour).
la source
Un script légèrement différent qui avance uniquement les branches dont le nom correspond à leur branche en amont. Il met également à jour la branche actuelle si une avance rapide est possible.
Assurez-vous que toutes les branches en amont de vos branches sont correctement définies en exécutant
git branch -vv
. Définissez la branche amont avecgit branch -u origin/yourbanchname
Copiez-collez dans un fichier et chmod 755:
la source
Le one-liner suivant avance rapidement toutes les branches qui ont une branche en amont si possible, et affiche une erreur sinon:
Comment ça marche?
Il utilise un format personnalisé avec la
git branch
commande. Pour chaque branche qui a une branche en amont, elle imprime une ligne avec le modèle suivant:Cela peut être directement canalisé
sh
(en supposant que les noms de branche sont bien formés). Omettez le| sh
pour voir ce qu'il fait.Avertissements
Le one-liner ne contactera pas vos télécommandes. Émettez un
git fetch
ougit fetch --all
avant de l'exécuter.La branche actuellement extraite ne sera pas mise à jour avec un message comme
Pour cela, vous pouvez recourir à la régularité
git pull --ff-only
.Alias
Ajoutez ce qui suit à votre
.gitconfig
afin d'git fft
exécuter cette commande:Voir aussi mon
.gitconfig
. L'alias est un raccourci pour "suivi rapide (branches)".la source
hub
solution de propulsion proposée par @John pour sa meilleure sortie.git push
car il est totalement opposé à ce que vous attendez. Quel est le secret?git push
?git push
a la sémantique de téléchargement - J'ai des commits localement que je veux envoyer en amont.git pull
a la sémantique de téléchargement - je veux obtenir des validations à distance en amont dans ma branche locale. Puisque nous parlons de télécharger de nouveaux commits de la télécommande vers la locale,git pull
c'est le choix évident. Mais non, cette astuce utilisegit push
. Comment cela segit push
traduit-il par l'extraction de modifications à distance dans ma succursale locale?!git push
peut également être utilisé pour mettre à jour les succursales locales, à condition qu'il s'agisse d'une mise à jour à avance rapide.Le script de @larsmans, un peu amélioré:
Cela, une fois terminé, laisse la copie de travail extraite de la même branche qu'avant l'appel du script.
La
git pull
version:la source
Il semble que beaucoup d'autres ont apporté des solutions similaires, mais j'ai pensé partager ce que j'avais trouvé et inviter d'autres personnes à contribuer. Cette solution a une belle sortie colorée, gère gracieusement votre répertoire de travail actuel, et est rapide car elle ne fait aucune extraction et laisse votre répertoire de travail intact. De plus, c'est juste un script shell sans dépendances autres que git. (testé jusqu'à présent sur OSX uniquement)
https://github.com/davestimpert/gitup
Désolé, je semble également avoir trouvé le même nom que l'autre outil ci-dessus.
la source
Cela peut être fait en utilisant le script ci-dessous ... Il va d'abord récupérer toutes les branches et passer une à une et mettre à jour par lui-même.
la source
Vous ne pouvez pas le faire avec une seule commande git mais vous pouvez l'automatiser avec une seule ligne bash.
Pour mettre à jour en toute sécurité toutes les branches avec une seule ligne, voici ce que je fais:
S'il ne peut pas avancer rapidement une branche ou rencontrer une erreur, il s'arrêtera et vous laissera dans cette branche afin que vous puissiez reprendre le contrôle et fusionner manuellement.
Si toutes les branches peuvent être transférées rapidement, cela se terminera avec la branche dans laquelle vous vous trouviez actuellement, vous laissant où vous étiez avant la mise à jour.
Explications:
Pour une meilleure lisibilité, il peut être réparti sur plusieurs lignes:
git fetch --all && ...
=> Récupère toutes les références de toutes les télécommandes et continue avec la commande suivante s'il n'y a pas eu d'erreur.git branch | sed '/*/{$q;h;d};$G' | tr -d '*'
=> A partir de la sortie degit branch
,sed
prenez la ligne avec a*
et déplacez-la à la fin (pour que la branche courante soit mise à jour en dernier).tr
Retirez ensuite simplement le*
.for branch in $(...) ; do git checkout $branch && git merge --ff-only || break ; done
=> Pour chaque nom de branche obtenu à partir de la commande précédente, extrayez cette branche et essayez de fusionner avec une avance rapide. S'il échoue, ilbreak
est appelé et la commande s'arrête ici.Bien sûr, vous pouvez remplacer
git merge --ff-only
avecgit rebase
si elle est ce que vous voulez.Enfin, vous pouvez le mettre dans votre bashrc comme alias:
Ou si vous avez peur de vous tromper avec les 'et ", ou si vous préférez simplement garder la lisibilité syntaxique dans votre éditeur, vous pouvez le déclarer comme une fonction:
Prime:
Pour ceux qui voudraient l'explication de la
sed '/*/{$q;h;d};$G'
partie:/*/
=> Recherchez la ligne avec un*
.{$q
=> S'il est dans la dernière ligne, quittez (nous n'avons rien à faire car la branche courante est déjà la dernière de la liste).;h;d}
=> Sinon, stockez la ligne dans le tampon de maintien et supprimez-la à la position actuelle de la liste.;$G
=> Quand il atteint la dernière ligne, ajoutez le contenu du tampon de maintien.la source
&&
en plaçantset -e
en haut du script.Non ça ne peut pas. Pour une avance rapide, je viens d'écrire un petit outil pour le faire. https://github.com/changyuheng/git-fast-forward-all
Avantages de cet outil:
hub sync
ne prend pas en charge plusieurs télécommandes pour le moment.)la source
git fetch . refspec
. Le.
dit d'aller chercher à partir du référentiel actuel plutôt que du référentiel distant.Depuis git 2.9:
git pull --rebase --autostash
Voir https://git-scm.com/docs/git-rebase
la source
En fait, avec git
version 1.8.3.1
, cela fonctionne:Dans la branche principale, vous pouvez mettre à jour toutes les autres branches. @Cascabel
Je ne sais pas quelle version le casser / réparer, en 2.17 (que j'utilise), cela peut fonctionner.
la source