Changer la valeur par défaut de la télécommande Git

228

Je souhaite modifier la destination de la branche distante par défaut de Git pour pouvoir simplement

git push

Au lieu de:

git push upstream

Actuellement, ce paramètre est défini sur la télécommande d'origine et je souhaite le définir sur une autre télécommande.

J'ai essayé de retirer la télécommande d'origine (clonée depuis)

git remote rm origin

Ce qui a supprimé la télécommande d'origine. Mais ne résout pas le git pushproblème. Je reçois toujours:

fatal: aucune destination push configurée. Spécifiez l'URL à partir de la
ligne de commande ou configurez un référentiel distant à l'aide de ...

J'ai aussi essayé de jouer avec:

git remote set-url --push myfork origin

et d'autres options mais aucune ne semble fonctionner (peut-être parce que j'ai supprimé la télécommande d'origine trop tôt?)

En suivant la réponse ici, j'ai essayé de changer:

git config push.default upstream (or matching)

mais ni l'un ni l'autre n'a fonctionné.

alonisser
la source

Réponses:

215

Vous pouvez utiliser git push -u <remote_name> <local_branch_name>pour définir l'amont par défaut. Voir la documentation de git push pour plus de détails.

1615903
la source
1
Ne fonctionne pas: je reçois '' 'fatal:' origin 'ne semble pas être un dépôt git fatal: l'extrémité distante a raccroché de manière inattendue' '' peut-être parce que j'ai supprimé origin remote avant de continuer. viens de trouver une solution de travail, je mettrai à jour une réponse
alonisser
34
Comme clarification supplémentaire, la syntaxe devrait être git push -u <remote_name> <local_branch_name>:<corresponding_remote_branch_name>.
Marco Lazzeri
33
Exemple: git push -u origin master:master.
starbeamrainbowlabs
1
Après avoir défini une télécommande par défaut ... n'y a-t-il pas de toute façon que vous pouvez forcer git pushà pousser la branche distante de la branche locale actuelle? Je veux dire que cela signifie que je dois exécuter cette commande pour chaque branche. Droite? Je ne peux pas simplement faire une configuration initiale pour le repo entier? @MarcoLazzeri
Honey
2
@starbeamrainbowlabs N'est-ce pas git push -u origin mastersuffisant? Êtes-vous en train d'illustrer la syntaxe complète?
Josiah Yoder
108

Pour modifier la télécommande en amont qui est «câblée» à votre succursale, utilisez la git branchcommande avec l'indicateur de configuration en amont.

Assurez-vous que la télécommande existe en premier:

git remote -vv

Définissez la télécommande préférée pour la branche actuelle (extraite):

git branch --set-upstream-to <remote-name>

Validez la branche est configurée avec la télécommande en amont correcte:

git branch -vv

Jordan McCullough
la source
2
Je viens d'essayer git branch --set-upstream-to myforket j'ai eu une erreur:> erreur: option inconnue `set-upstream-to 'j'utilise git 1.7.9
alonisser
3
La syntaxe a changé en 1.8, voir stackoverflow.com/questions/520650/…
jtniehof
1
Voir la réponse suivante: stackoverflow.com/a/2432799/1820106 ( git remote set-url origin PATH_TO_REMOTE)
Yinon Ehrlich
10
git branch -u <remotename>/<branch>travaillé pour moi. La commande a été exécutée avec la branche d'intérêt locale extraite. Voir «Tracking Branches» sur git-scm.com/book/it/v2/Git-Branching-Remote-Branches
norio
2
La sortie détaillée de la commande à distance est vraiment juste git remote -vou git remote --verbose. Le -vvv supplémentaire de est redondant.
Artif3x
45

Travailler avec Git 2.3.2 ...

git branch --set-upstream-to myfork/master

Maintenant status, pushet pullsont dirigés vers la myforktélécommande

pinei
la source
Cela fonctionne lorsque vous souhaitez également définir la valeur par défaut pour pull.
StingyJack
39

Vous pouvez facilement changer la télécommande par défaut pour les succursales en une seule fois en utilisant cette commande

git push -u <remote_name> --all
Mykola Denysyuk
la source
14
Juste pour noter, cela les poussera tous, ainsi que changer leur télécommande en amont.
poolie
16

Si vous l'avez fait git push origin -u localBranchName:remoteBranchNameet sur des git pushcommandes séquentielles , vous obtenez des erreurs alors que l'origine n'existe pas, puis procédez comme suit:

  1. git remote -v

Vérifiez s'il y a une télécommande dont je me fiche. Supprimez-les avecgit remote remove 'name'

  1. git config --edit

Recherchez les signes possibles d'une télécommande ancienne / inexistante. Recherchez pushdefault:

[remote]
  pushdefault = oldremote

Mettre à jour oldremote valeur et enregistrez.

git push devrait fonctionner maintenant.

Șerban Ghiță
la source
2
Merci! J'ai tendance à ajouter -ulors de l'utilisation git pushd'une télécommande différente en raison de la mémoire musculaire. Cela fait de la télécommande donnée la valeur par défaut, la réinitialiser en utilisant git config --edit(ou en poussant à nouveau et en définissant une nouvelle télécommande) a résolu le problème.
Tim Visée
13

Juste une clarification (en utilisant la version 1.7.9.5 de git sur Ubuntu 12.04):

Git ajoutera / supprimera des télécommandes. Ce sont des instances distantes de git avec un serveur connecté.

git remote add myremote git://remoteurl

Vous pouvez ensuite récupérer ledit référentiel git comme suit:

git fetch myremote

Il semble que cela crée une branche nommée «myremote», mais la télécommande de la branche n'est pas définie automatiquement. Pour ce faire, vous devez procéder comme suit:

Tout d'abord, vérifiez que vous avez ce problème, c.-à-d.

git config -l | grep myremote

Vous devriez voir quelque chose comme:

remote.myremote.url=git://remoteurl
remote.myremote.fetch=+refs/heads/*:refs/remotes/myremote/*
branch.myremote.remote=.
branch.myremote.merge=refs/heads/master

Si vous voyez branch.myremote.remote=., alors vous devez continuer:

git config branch.myremote.remote myremote
git checkout myremote
git pull

Vous devriez maintenant être à jour avec le référentiel distant, et vos pulls / pushs devraient être liés à la télécommande appropriée. Vous pouvez changer de télécommande de cette manière, par branche . [Note 1]

Selon une documentation The Official Git Config , vous pouvez configurer une branche push par défaut (recherchez simplement remote.pushdefault sur cette page), mais gardez à l'esprit que cela n'affectera pas les référentiels / branches qui existent déjà, donc cela fonctionnera mais seulement pour les nouveaux référentiels / succursales. Vous devez vous rappeler que --globalcela définira les valeurs par défaut du référentiel utilisateur (~ / .gitconfig), les --systemvaleurs par défaut du référentiel à l'échelle du système (/ etc / gitconfig), et aucun indicateur ne définira les options de configuration pour le référentiel actuel (./.gitconfig).

Il convient également de noter que l' option de configuration push.default sert à configurer le comportement de spécification de référence , et non le comportement à distance .

[1]: git branch --set-upstream myotherremotefonctionnerait généralement ici, mais git se plaindra de ne pas définir une branche comme sa propre télécommande si elle git branch --set-upstream myremoteest utilisée. Je crois cependant que c'est un comportement incorrect.

smaudet
la source
Au lieu de git config -l | grep myremote, vous pouvez simplement utiliser:git config --get branch.myremote.remote
Murmel
@ Murmel d'abord, c'est un wiki communautaire alors n'hésitez pas à vous améliorer, deuxièmement, --getadoptez un comportement particulier, je note qu'il existe d'autres façons de configurer les amonts mais cela fournit un moyen de trouver les informations sans se fier uniquement à l'outillage git pour être correct. Git n'est pas parfait, il vaut mieux comprendre les données, ce qu'il fait et ensuite espérer que ses invocations fonctionnent correctement.
smaudet
10

Il pourrait être utile de jeter un œil à l' .git/configintérieur de votre référentiel, il répertoriera toutes les télécommandes ainsi que la télécommande par défaut pour chaque branche

par exemple.

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = [email protected]:fii/web2016.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "bugfix/#8302"]
    remote = origin
    merge = "refs/heads/bugfix/#8302"
[branch "feature/#8331"]
    remote = origin
    merge = "refs/heads/feature/#8331"
[remote "scm"]
    url = https://scm.xxx.be/git/web2016bs.git
    fetch = +refs/heads/*:refs/remotes/scm/*

vous pouvez apporter des modifications manuelles dans ce fichier pour supprimer une télécommande indésirable, ou mettre à jour les télécommandes par défaut pour les différentes branches que vous avez

  • Faites attention! lors de la modification ou de la suppression des télécommandes, assurez-vous de mettre à jour toutes les références dans ce fichier de configuration
Kim Paulissen
la source
5

Une autre technique que je viens de trouver pour résoudre ce problème (même si j'ai d'abord supprimé l'origine, ce qui semble être une erreur) consiste à manipuler directement git config:

git config remote.origin.url url-to-my-other-remote
alonisser
la source
5
Ce n'est pas une bonne solution, les utilisateurs de git devraient pouvoir tirer / pousser à partir de plusieurs référentiels - bien que cela vous permette de changer la télécommande de l'original, cela ne signifie pas que vous DEVRIEZ changer la télécommande de l'original, car cela signifie probablement qu'il y a sont un certain nombre d'incompatibilités entre les télécommandes. La fusion aidera ici, mais c'est à la fois plus simple et conserve plus d'historique pour configurer la télécommande sur la nouvelle branche.
smaudet
Pas la bonne façon de le faire ... @ La réponse de Jordan est plus appropriée
Raja Anbazhagan
1
Voir aussi: stackoverflow.com/a/2432799/1820106 ( git remote set-url origin PATH_TO_REMOTE)
Yinon Ehrlich
5

Très simplement, et bricoler certains des excellents commentaires ici avec mes propres recherches à ce sujet.

Tout d'abord, vérifiez la succursale locale que vous souhaitez associer à votre succursale distante:

git checkout mybranch

Prochain:

git branch -u origin/mybranch

où:

git branch -u {remote name}/{branch name}

Vous devriez recevoir un message:

"Branch mybranch set up to track remote branch mybranch from origin."
Artif3x
la source
3

Dans mon cas, j'ai corrigé ce qui suit: * run git config --edit * Dans le fichier de configuration git:

[branch "master"]
remote = origin # <--- change the default origin here
Ron
la source
0

git remote set-url --push origin devrait fonctionner, comme vous l'avez mentionné, mais vous devez fournir explicitement l'URL au lieu d'un autre nom distant, par exemple

git remote set-url --push origin [email protected]:contributor/repo.git

Vous pouvez confirmer si cela a fonctionné en faisant a git remote -v. Par exemple

λ ~/go/src/github.com/stretchr/testify/ master git remote -v
fork    [email protected]:contributor/testify.git (fetch)
fork    [email protected]:contributor/testify.git (push)
origin  [email protected]:stretchr/testify (fetch)
origin  [email protected]:contributor/testify.git (push)
les abeilles
la source