83 votes

Différents remote par défaut (branche de suivi) pour git pull et git push

Existe-t-il un moyen de mettre en place un dépôt git, de sorte que git pull par défaut, il s'agit d'une télécommande et git push par défaut à un autre ? Je sais que je peux définir à la fois en modifiant la valeur de l'élément remote dans la section branche de .git/config Mais comment faire pour chaque direction séparément ?

108voto

user392887 Points 391

Depuis la version 1.7.0 de Git, vous pouvez définir ceci avec :

git remote set-url --push origin https://your.push.com/blah/

1 votes

3 ans après la question, mais cela devrait être la nouvelle réponse acceptée !

1 votes

@Kevlar Pourquoi ? Accepter est utilisé pour marquer non pas toujours les "meilleures" réponses, mais celle qui a fonctionné pour le PO (lire la FAQ pour plus d'informations). Au moment où la question a été posée, la réponse ci-dessus n'aurait pas fonctionné (n'aurait même pas existé), car git était bien antérieur à la version 1.8. La réponse acceptée a cependant fonctionné pour l'OP. Quelle raison trouvez-vous pour changer la décision du PO après trois ans ?

13 votes

@trejder Stack Overflow est aussi un endroit pour servir des réponses utiles aux futurs visiteurs, qui trouvent une question via un moteur de recherche ou autre. Il est important que la meilleure réponse apparaisse en premier. Je ne dis pas qu'OP doit changer la réponse acceptée, mais qu'il serait tout à fait raisonnable (et à mon avis très positif) de le faire.

37voto

MvanGeest Points 6421

Depuis Git 1.8.3, vous pouvez utiliser l'option remote.pushDefault pour faire exactement ce que vous voulez (c'est-à-dire avoir des télécommandes par défaut différentes pour les pull y push ). Vous pouvez définir l'option comme n'importe quelle autre ; par exemple, pour la définir sur l'option pushTarget à distance, utiliser

git config remote.pushDefault pushTarget

Cette option a l'effet suivant :

  • git pull tirera de la télécommande spécifiée par l'option remote dans la section de la branche concernée dans .git/config , tandis que
  • git push poussera vers la télécommande spécifiée par remote.pushDefault .

Notez que vous devez spécifier le nom d'une télécommande, et non d'une URL. Cette solution est donc plus flexible que la solution impliquant remote.<name>.pushurl Le système de gestion de l'accès à l'Internet est un système de gestion de l'accès à l'Internet, car (par exemple) vous aurez toujours des branches de suivi pour les deux télécommandes. C'est à vous de décider si vous avez besoin ou non de cette flexibilité.

Les notes de version dire que cette option a été ajoutée spécifiquement pour soutenir les flux de travail triangulaires.

29voto

Chris Johnsen Points 50064

Pour Git 1.6.4 et les versions ultérieures, définissez remote.<name>.pushurl avec git config .

On peut s'en servir pour tirer parti de l'accès en lecture seule à l'application https: et push à l'aide d'un protocole basé sur ssh.


Dites origin L'url du site ( remote.origin.url ) es https://git.example.com/some/repo.git . Il est en lecture seule, mais vous avez un accès en écriture par l'intermédiaire de l'"URL" basée sur ssh git@git.example.com:some/repo.git . Exécutez la commande suivante pour effectuer une poussée via le protocole ssh :

git config remote.origin.pushurl git@git.example.com:some/repo.git

7voto

Quuxplusone Points 4320

Merci à MvanGeest pour la mise en place d'un lien vers les notes de version de git 1.8.3 . Ces notes de mise à jour indiquent :

  • Un flux de travail triangulaire "tirer d'un endroit, pousser à un autre". est mieux pris en charge par les nouvelles technologies de l'information et de la communication (TIC). remote.pushdefault (remplace l'option "origine") et branch.*.pushremote (remplace l'option branch.*.remote ).

J'utilise un flux de travail triangulaire de ce type tout le temps pour les contributions à source ouverte. Par exemple : J'ai ma propre version GitHub de llvm/llvm-project et je veux garder la mienne main à jour avec la branche main . J'ai donc fréquemment git pull upstream main ; il serait pratique de pouvoir simplement taper git pull au lieu de cela. Mais.., Je ne veux pas risquer de faire un gros doigt d'honneur git push<return> au lieu de git push origin main<return> et accidentellement pousser vers le repo du projet en amont avant d'en avoir l'intention ! Ainsi, avant aujourd'hui, mon .git/config ressemblait à ceci :

[remote "origin"]
        url = git@github.com:Quuxplusone/llvm-project
        fetch = +refs/heads/*:refs/remotes/origin/*
[remote "upstream"]
        url = git@github.com:llvm/llvm-project
        fetch = +refs/heads/*:refs/remotes/upstream/*
[branch "main"]
        merge = refs/heads/main
        remote = origin

En me basant sur la note de version citée ci-dessus, je viens de modifier le fichier .git/config à cela :

[remote "origin"]
        url = git@github.com:Quuxplusone/llvm-project
        fetch = +refs/heads/*:refs/remotes/origin/*
[remote "upstream"]
        url = git@github.com:llvm/llvm-project
        fetch = +refs/heads/*:refs/remotes/upstream/*
[branch "main"]
        merge = refs/heads/main
        remote = upstream
        pushremote = origin

Je peux maintenant faire un simple git checkout main ; git pull pour tirer de l'amont/principal, et un simple git checkout main ; git push pour pousser vers origin/main. C'est le "flux de travail triangulaire" que je souhaite.

5voto

VonC Points 414372

D'après ce que je peux déduire de la git config man page le repo en amont est :

  • par origine par défaut
  • fixé par branch.remote
  • toujours pour les deux git pull/fetch y git pull

Pour une branche donnée, je ne vois pas comment il serait possible d'avoir deux télécommandes distinctes. par défaut .

0 votes

Cela semble être vrai en pratique pour git v1.8.3.2, après avoir essayé à la fois l'option git config remote... et git remote set-url...`, pour une seule branche ou pour une copie entière d'un repo.

0 votes

Pour réinitialiser la télécommande par défaut à origin pour la branche courante et pousser/tirer vers/depuis le nom de la branche correspondante : git push --set-upstream origin <current_branch_name>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X