web-dev-qa-db-fra.com

Configurez git pour tirer et pousser toutes les branches

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

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

Sinon, quand j’ajoute une nouvelle branche localement et que je veux la retirer du serveur, quel est le moyen le plus simple de le faire?

J'ai créé une nouvelle branche du même nom et j'ai essayé de tirer, mais cela ne fonctionne pas. Me demande pour toute la config à distance de la branche. Comment puis-je le mettre.

552
Lakshman Prasad

Le moyen le plus simple est de faire:

git Push --all Origin

Cela va pousser les balises et les branches.

1178
brimble2010

Avec git moderne, vous récupérez toujours toutes les branches (en tant que branches distantes suivies dans refs/remotes/Origin/* espace de noms, visible avec git branch -r ou git remote show Origin).

Par défaut (voir la documentation de la variable Push.default config), vous appuyez sur les branches correspondantes , qui signifie que vous devez d’abord faire git Push Origin branch pour que git Pousse 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 éditez directement le fichier .git/config afin d’obtenir le résultat suivant:

 [remote "Origin"] 
 url = [email protected]: /srv/git/repo.git 
 fetch = + refs/heads/*: refs/remotes/Origine /*
 Fetch = + refs/tags/*: refs/tags /*
 Push = + refs/heads/*: refs/heads /*
 Push = + refs /tags/*:refs/tags/*
143
Jakub Narębski

Inclure le + dans la spécification Push est probablement une mauvaise idée, car cela signifie que git fera volontiers une Push 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/*'
32
Mark Reed

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

NOTE: Je devais utiliser la commande avant-dernier (c.-à-d. appuyer en premier sur le maître) lors du clonage d'un référentiel de Atlassian Stash AWS CodeCommit (référentiel 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.

19
vikas027

Si vous déplacez des branches vers un nouveau dépôt depuis un ancien et que vous n’avez PAS toutes les anciennes branches de dépôt locales, vous devez 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 à distance:

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

Ensuite, vous pouvez tout pousser en utilisant cette commande:

git Push -u bb --all

Vous pouvez également configurer le référentiel à l'aide des commandes git config indiquées dans les autres réponses ici si vous ne le faites pas une fois ou si vous ne souhaitez déplacer que des branches locales.

Le point important, les autres réponses uniquement Poussez toutes les branches LOCALES. Si les branches n'existent que dans un autre référentiel REMOTE, elles ne seront pas déplacées sans un suivi préalable. La boucle for présentée ici aidera à cela.

11
Lance Cleveland

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

Pour pousser toutes les branches, essayez:

git Push --all
5
tokhi

Si vous déplacez toutes les branches d’un ancien stockage vers un nouveau référentiel, vous devez configurer le suivi de chaque branche dans les branches Origin existantes, avant de passer au nouveau référentiel, sinon tous votre Les branches d'origine n'apparaîtront pas dans la nouvelle origine. Faites ceci manuellement en suivant ou en vérifiant chaque branche, ou utilisez le liner:

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 les versions de celle-ci dans d'autres réponses de cette page, mais est sans doute meilleure car:

  1. il configure correctement le suivi des branches, contrairement à certaines variantes plus anciennes de cette commande sur cette page qui fournissent un seul paramètre à --track et chaque branche finit par suivre le maître - pas bon
  2. nomme les succursales locales sans le préfixe "Origine /", ce que je ne souhaite personnellement pas - et correspond à ce qui se passe lorsque vous passez une caisse normalement.
  3. saute le maître de suivi puisque cela se produit déjà
  4. ne fait pas de caisse, donc c'est rapide
  5. évite de trébucher sur le -> dans la sortie de git branch -r

Ensuite, si vous changez d'origines, remplacez le lien vers l'ancienne origine et pointez vers une nouvelle télécommande. Assurez-vous d’abord de créer la nouvelle télécommande à l’aide de l’interface graphique bitbucket/github, mais n’ajoutez aucun fichier, sinon 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 nécessaire pour pousser également les balises:

git Push -u --all Origin
git Push --tags Origin
3
abulka

Solution sans codage 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 balises

Pourquoi devriez-vous PAS coder en dur Origin dans config?

Si vous codez:

  1. Vous vous retrouverez avec Origin comme télécommande dans toutes les mises en pension. Donc, vous ne pourrez pas ajouter Origin, mais vous devrez utiliser set-url.
  2. Si un outil crée une télécommande avec un nom différent, appuyez sur Toutes les configurations ne seront pas appliquées. Ensuite, vous devrez renommer la télécommande, mais le changement de nom ne fonctionnera pas car Origin existe déjà (à partir du point 1). Rappelez-vous :)

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

Selon la réponse de Jakub Narębski:

Avec git moderne, vous extrayez toujours toutes les branches (comme des branches de suivi à distance dans les espaces de noms refs/remote/Origin/*

0
Dheeraj Bhaskar
for b in $(git branch -a | grep -v master | \
sed -e "s|remotes\/Origin\/\(.*\)|\1|g"); do git checkout $b && \
git Push Origin $b; done
0
030