Configurer git pour tirer et pousser toutes les branches

j'aimerais pousser et tirer toutes les branches par défaut, y compris les nouvelles.

Est-il un paramètre que je peux définir pour elle?

sinon, quand j'ajoute une nouvelle branche, localement et que je veux la retirer du serveur, Quelle est la façon la plus simple de le faire?

j'ai créé une nouvelle branche avec le même nom et j'ai essayé de tirer mais ça ne marche pas. Il me demande toute la configuration de la branche. Comment puis-je le régler.

482
demandé sur Lakshman Prasad 2009-12-16 16:09:52

9 réponses

la manière la plus simple est de faire:

git push --all origin

cela poussera les étiquettes et les branches.

1037
répondu brimble2010 2015-01-05 11:50:43

avec Git moderne vous toujours aller chercher toutes les branches (comme les branches de suivi à distance dans refs/remotes/origin/* espace de nom, visible avec git branch -r ou git remote show origin ).

par défaut (voir la documentation de push.default variable de configuration) vous poussez branches correspondantes , ce qui signifie que vous devez d'abord faire git push origin branch pour git pour le pousser toujours sur git push .

Si vous voulez toujours pousser toutes les branches , vous pouvez configurer push refspec. En supposant que la télécommande s'appelle origin vous pouvez utiliser git config :

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

ou directement modifier .git/config fichier d'avoir quelque chose comme ce qui suit:

[remote "origin"]
        url = user@example.com:/srv/git/repo.git
        fetch = +refs/heads/*:refs/remotes/origin/*
        fetch = +refs/tags/*:refs/tags/*
        push  = +refs/heads/*:refs/heads/*
        push  = +refs/tags/*:refs/tags/*
140
répondu Jakub Narębski 2009-12-16 14:38:09

inclure le + dans la spécification push est probablement une mauvaise idée, car cela signifie que git sera heureux de faire une push Non-fast-forward même sans-f , et si le serveur distant est configuré pour les Accepter, vous pouvez perdre l'historique.

essayez 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/*'
32
répondu Mark Reed 2011-06-17 04:48:45

j'avais utilisé les commandes ci-dessous pour migrer toutes les branches vers le nouveau dépôt.

~$ 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

NOTE : j'ai dû utiliser la commande "push master first" en clonant une mise en pension d'Atlassian Stash à AWS CodeCommit (mise en pension vierge). Je ne suis pas sûr de la raison, mais après avoir poussé ( git push new-origin --mirror ) branche par défaut se référait à une autre branche que master .

16
répondu vikas027 2017-06-03 03:55:49

si vous déplacez des branches à une nouvelle pension à partir d'une ancienne et que vous N'avez pas toutes les anciennes branches de pension locales, vous aurez besoin de les suivre en premier.

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

puis ajouter votre nouvelle prise en charge à distance:

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

alors vous pouvez pousser tout en utilisant cette commande:

git push -u bb --all

ou vous pouvez configurer le repo en utilisant les commandes de configuration git notées dans les autres réponses ici si vous ne faites pas cela une seule fois ou si vous êtes seulement je cherche à déplacer des agences locales.

le point important, les autres réponses ne poussent que toutes les branches locales. Si les branches n'existent que sur un dépôt distant alternatif, elles ne bougeront pas sans les suivre d'abord. Pour la boucle présentée ici va vous aider.

9
répondu Lance Cleveland 2017-02-02 17:08:24

pour voir toutes les branches sans utiliser git branch -a vous devez exécuter:

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

Maintenant vous pouvez voir toutes les branches:

git branch

À pousser toutes les branches d'essayer:

git push --all
5
répondu tokhi 2015-01-15 10:14:04

si vous déplacez toutes les branches vers une nouvelle pension à partir d'une ancienne, alors dans votre pension locale, vous devez configurer le suivi de chaque branche vers les branches d'origine existantes, avant de pousser vers la nouvelle pension, sinon toutes vos branches d'origine n'apparaîtront pas dans la nouvelle origine. Faites ceci manuellement en traçant ou en vérifiant chaque branche, ou utilisez la doublure:

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

Cette ligne de commande est basé sur des versions dans d'autres réponses sur cette page, mais est sans doute meilleur parce que:

  1. il configure correctement le tracking de branche, contrairement à quelques anciennes variantes de cette commande sur cette page qui ne fournissent qu'un paramètre à -- track et donc chaque branche finit par tracking master-pas bon
  2. nomme les branches locales sans le préfixe "origin/" que je ne veux pas personnellement - et est cohérent avec ce qui se passe quand vous vérifiez une branche normalement.
  3. suivi de maître puisque c'est déjà en cours
  4. n'a pas réellement vérifier quoi que ce soit donc est rapide
  5. évite de trébucher sur le - > dans la production de la branche git-r

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

git remote set-url origin git@bitbucket.org:YOUR/SOMEREPO.git

maintenant, poussez. Notez que la deuxième commande est nécessaire pour pousser les tags aussi bien:

git push -u --all origin
git push --tags origin
2
répondu abulka 2017-03-29 06:28:46
for b in $(git branch -a | grep -v master | \
sed -e "s|remotes\/origin\/\(.*\)||g"); do git checkout $b && \
git push origin $b; done
0
répondu 030 2016-11-14 11:33:49

Solution sans coder en dur origin dans la configuration

utilisez ce qui suit dans votre global gitconfig

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

cela pousse toutes les branches et toutes les étiquettes

pourquoi ne pas utiliser le code dur origin dans config?

si vous hardcode:

  1. vous finirez avec origin comme une télécommande dans toutes les repos. De sorte que vous ne serez pas en mesure de ajouter de l'origine, mais vous devez utiliser set-url .
  2. si un outil crée une télécommande avec un nom différent, toute la configuration ne s'appliquera pas. Ensuite, vous devrez renommer la télécommande, mais renommer ne fonctionnera pas car origin existe déjà (à partir du point 1) rappelez-vous:)

la récupération est pris en charge déjà par moderne git

selon la réponse de Jakub Narębski:

avec git moderne vous récupérez toujours toutes les branches (comme les branches de suivi à distance dans refs / remotes / origin / * namespace

0
répondu Dheeraj Bhaskar 2017-06-18 12:25:48