Configurer git pour tirer et pousser toutes les branches

616

Je voudrais pousser et tirer toutes les branches par défaut, y compris celles nouvellement créées.

Y a-t-il un paramètre que je peux définir pour cela?

Sinon, lorsque j'ajoute une nouvelle branche, localement et que je veux la retirer du serveur, quelle est la manière la plus simple de le faire?

J'ai créé une nouvelle branche avec le même nom et j'ai essayé de tirer mais cela ne fonctionne pas. Me demande pour toute la config distante de la branche. Comment le définir.

Lakshman Prasad
la source
4
"et a essayé de tirer mais ça ne marche pas". Détails s'il vous plaît. Montrez-nous quelle commande vous avez essayé d'utiliser.
Jakub Narębski

Réponses:

1298

La façon la plus simple est de faire:

git push --all origin

Cela poussera les balises et les branches.

brimble2010
la source
10
Parmi des dizaines de réponses que j'ai trouvées sur SO et ailleurs, c'est le moyen le plus simple de pousser une branche locale nouvellement créée, sans toucher à la configuration. Merci!
András Szepesházi
174
Et si vous ajoutez -uune fois, par exemple git push --all origin -u, le suivi est configuré et après cela, vous pouvez simplement l'utiliser git push.
Alec
23
Pour la version 1.7.12.3 de git, j'ai dû utiliser git push --tags originpour pousser toutes les balises.
thisgeek
17
Regardez aussi "--mirror" au lieu de "--all" cette poussée plus de choses
Loda
21
AVERTISSEMENT: si vous avez un tas de branches LOCALES que vous n'avez pas nettoyées (fonctionnalités, correctifs) - ou que vous n'avez pas nettoyées correctement (moi), cela inondera votre télécommande. Zut. Et nous venons de faire un élagage. Je ne sais pas pourquoi mon local avait autant de succursales.
Jack
147

Avec git moderne, vous récupérez toujours toutes les branches (en tant que branches de suivi à distance dans l' refs/remotes/origin/*espace de noms, visibles avec git branch -rou git remote show origin).

Par défaut (voir la documentation de la push.defaultvariable config), vous poussez les branches correspondantes , ce qui signifie que vous devez d'abord faire git push origin branchpour que git le pousse toujours git push.

Si vous souhaitez toujours pousser toutes les branches , vous pouvez configurer push refspec. En supposant que la télécommande est nommée, originvous pouvez soit utiliser git config :

$ git config --add remote.origin.push '+refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push '+refs/tags/*:refs/tags/*'

ou modifiez directement le .git/configfichier pour avoir quelque chose comme ceci:

[origine "distante]
        url = [email protected]: /srv/git/repo.git
        chercher = + refs / têtes / *: refs / télécommandes / origine / *
        fetch = + refs / tags / *: refs / tags / *
        push = + refs / heads / *: refs / heads / *
        push = + refs / tags / *: refs / tags / *
Jakub Narębski
la source
3
@Merc: git push --all originest bon pour publier une seule fois toutes les branches et les balises, bien que par défaut jusqu'à la version actuelle, la sémantique de correspondance signifierait que vous poussiez toutes les branches par la suite ... sauf si vous ajoutez une nouvelle branche ou une nouvelle balise. Le réglage de « pousser [...] toutes les branches par défaut » est comme écrit.
Jakub Narębski
Vous pouvez améliorer la réponse pour ajouter la façon de reconfigurer Git de cette façon. Ceci est utile pour les utilisateurs ayant défini le mode simple.
Dereckson
3
Cela a changé depuis git 2.0. Le push par défaut est simple, ne correspond plus.
Mike
J'ai essayé cela et j'ai reçu une erreur lors de la transmission: fatal: Invalid refspec ''+refs/heads/*:refs/heads/*'' (Remarque: je suis sur git 2.0. Je suis toujours en train de résoudre ce problème.)
Brian Lacy
2
Maintenant , la valeur par défaut pour push.defaultest simple.
hasanghaforian
32

Inclure le + dans la spécification de push est probablement une mauvaise idée, car cela signifie que git fera volontiers une poussée non rapide, même sans -f , et si le serveur distant est configuré pour les accepter, vous pouvez perdre l'historique.

Essayez juste ceci:

$ git config --add remote.origin.push 'refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push 'refs/tags/*:refs/tags/*'
$ git config --add remote.origin.fetch 'refs/heads/*:refs/remotes/origin/*'
$ git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'
Mark Reed
la source
Vous pouvez également ajouter l' --globaloption à chacun d'eux pour en faire la valeur par défaut globale pour tous vos référentiels.
Ether
Il est regrettable que le + soit ajouté automatiquement par git lors de l'exécution git remote add.
Ether
27

J'avais utilisé les commandes ci-dessous pour migrer toutes les branches vers le nouveau référentiel.

~$ git clone --mirror <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin master
~$ git push new-origin --mirror

REMARQUE : j'ai dû utiliser l'avant-dernière commande (c'est-à-dire pousser le maître en premier) lors du clonage d'un dépôt de Atlassian Stash vers AWS CodeCommit ( dépôt vide). Je ne suis pas sûr de la raison, mais après avoir poussé ( git push new-origin --mirror), la branche par défaut faisait référence à une autre branche que master.

vikas027
la source
1
Parfait pour déplacer un dépôt vers un autre hôte. Je vous remercie!
Pelmered
2
Ce n'est en effet qu'une méthode utile. Utilisez git push new_origin --allsimplement pousser vos branches locales actuelles vers new_origin, pas toutes les branches d'origine.
yanzi1225627
Juste en notant que cela fait un --bareréférentiel, qui est un peu différent d'un référentiel normal, il ne contient que les .gitfichiers, pas vos fichiers. C'est parfaitement suffisant si vous n'allez pas y travailler. Voir --bareet --mirror git-scm.com/docs/git-clone .
jmmut
Bien qu'il ne contienne que les fichiers .git et non le code source réel, si vous effectuez une mise à jour à distance, il récupérera tout de l'origine à la destination.
SanthoshM
Ce fut une bouée de sauvetage! Cette méthode "maître avant miroir" a corrigé le problème avec Bitbucket comme destination et croyant qu'une branche différente de "maître" était la branche principale.
Toddius Zho
12

Si vous déplacez des branches vers un nouveau référentiel à partir d'une ancienne et que vous n'avez PAS toutes les anciennes branches de référentiel locales, vous devrez d'abord les suivre.

for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done

Ajoutez ensuite votre nouveau référentiel distant:

git remote add bb <path-to-new-repo>

Ensuite, vous pouvez pousser tout en utilisant cette commande:

git push -u bb --all

Ou vous pouvez configurer le dépôt à l'aide des commandes git config notées dans les autres réponses ici si vous ne le faites pas une seule fois ou si vous cherchez uniquement à déplacer les branches locales.

Le point important, les autres réponses ne poussent que toutes les branches LOCALES. Si les branches n'existent que sur un autre dépôt REMOTE, elles ne se déplaceront pas sans les suivre au préalable. La boucle for présentée ici vous y aidera.

Lance Cleveland
la source
BTW, j'utilise "bb" à la place d '"origine" ici parce que je suppose que votre dépôt d'origine / ancien a été nommé "origine" et est probablement toujours attaché à cette étiquette. "bb" est pour Bitbucket, où j'ai déplacé mon dépôt d'origine, mais vous pouvez l'appeler quelque chose de plus applicable comme "neworigin" si vous préférez.
Lance Cleveland
2
Ça n'a pas marché pour moi. A fini avec toutes les branches distantes suivant la même branche locale: /
jhsowter
2
AFAIK cela ne devrait pas fonctionner, selon le commentaire de @jhsowter. la bonne commande pour moi de suivre une branche distante dans un référentiel nouvellement cloné est git branch --track reponame origin/reponamesinon vous obtiendrez toutes les branches distantes suivies sur la branche locale actuelle
Pioneer Skies
J'ai modifié l'extrait de collecte de repo en git branch -r | grep -v '\->' | sed 's/ origin\///', qui donne uniquement le nom de la branche distante.
Paul Hicks
6

Pour voir toutes les branches sans utiliser, git branch -avous devez exécuter:

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

Vous pouvez maintenant voir toutes les branches:

git branch

Pour pousser toutes les branches, essayez:

git push --all
tokhi
la source
1
λ git fetch --all origin fatal: fetch --all ne prend pas d'argument de référentiel
foxundermon
essayez-vous git fetch --all?
tokhi
4

Si vous déplacez toutes les branches vers un nouveau référentiel à partir d'une ancienne, dans votre référentiel local, vous devez configurer le suivi de chaque branche vers les branches d'origine existantes, avant de passer au nouveau référentiel, sinon toutes vos branches d'origine n'apparaîtront pas dans la nouvelle origine. Pour ce faire, manuellement en suivant ou en vérifiant chaque branche, ou utilisez le seul revêtement:

for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done

Cette commande d'une ligne est basée sur des versions de celle-ci dans d'autres réponses sur cette page, mais est sans doute meilleure parce que:

  1. il configure correctement le suivi des branches, contrairement à certaines variantes plus anciennes de cette commande sur cette page qui ne fournissent qu'un seul paramètre à --track et donc chaque branche finit par suivre master - pas bon
  2. nomme les branches locales sans le préfixe «origine /», ce que je ne veux pas personnellement - et est cohérent avec ce qui se passe lorsque vous extrayez une branche normalement.
  3. saute le maître de suivi car cela se produit déjà
  4. ne vérifie vraiment rien donc est rapide
  5. évite de trébucher sur le -> dans la sortie de la branche git -r

Ensuite, si vous changez d'origines, remplacez le lien vers l'ancienne origine et pointez sur une nouvelle télécommande. Assurez-vous de créer d'abord la nouvelle télécommande, en utilisant l'interface graphique bitbucket / github, mais n'y ajoutez aucun fichier ou il y aura un problème de fusion. Par exemple

git remote set-url origin [email protected]:YOUR/SOMEREPO.git

Maintenant, poussez. Notez que la deuxième commande est également nécessaire pour pousser les balises:

git push -u --all origin
git push --tags origin
abulka
la source
0

Solution sans codage originen dur dans la configuration

Utilisez ce qui suit dans votre gitconfig global

[remote]
    push = +refs/heads/*
    push = +refs/tags/*

Cela pousse toutes les branches et toutes les balises

Pourquoi ne PAS coder originen dur dans la configuration?

Si vous codez en dur:

  1. Vous vous retrouverez avec originune télécommande dans tous les dépôts. Vous ne pourrez donc pas ajouter d'origine, mais vous devez utiliser set-url.
  2. Si un outil crée une télécommande avec un nom différent, toutes les configurations ne s'appliqueront pas. Ensuite, vous devrez renommer la télécommande, mais renommer ne fonctionnera pas car originexiste déjà (à partir du point 1) rappelez-vous :)

La récupération est déjà prise en charge par git moderne

Selon la réponse de Jakub Narębski:

Avec git moderne, vous récupérez toujours toutes les branches (en tant que branches de suivi à distance dans les espaces de noms refs / remotes / origin / *

Dheeraj Bhaskar
la source