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.
9 réponses
la manière la plus simple est de faire:
git push --all origin
cela poussera les étiquettes et les branches.
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/*
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/*'
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
.
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.
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
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:
- 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
- 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.
- suivi de maître puisque c'est déjà en cours
- n'a pas réellement vérifier quoi que ce soit donc est rapide
- é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
for b in $(git branch -a | grep -v master | \
sed -e "s|remotes\/origin\/\(.*\)||g"); do git checkout $b && \
git push origin $b; done
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:
- 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 utiliserset-url
. - 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