web-dev-qa-db-fra.com

Utiliser uniquement un proxy pour certaines URL / domaines git?

Est-il possible de configurer git pour utiliser un proxy uniquement pour des domaines spécifiques?

J'aimerais utiliser notre proxy d'entreprise pour accéder à Github, mais laissez-le désactivé pour accéder à nos propres git repos internes.

J'utilise bower et il doit nécessiter des éléments à la fois dans notre pare-feu et sur github, donc je ne peux pas le faire en tant que paramètre par projet. Il doit s'agir d'une sorte d'option de configuration globale. Des pensées?

50
robdodson

J'utilise généralement les variables d'environnement:

  • http_proxy=http://username:password@proxydomain:port
  • https_proxy=http://username:password@proxydomain:port

Cela est récupéré par git lors de l'accès au dépôt GitHub.

Remarque:

  • tous les deux http_proxy et https_proxy doit utiliser le http:// URL du proxy (pas de https://).
  • utilisez toujours le fqn (nom complet qualifié) de proxydomain (ne vous fiez pas à son nom court)

Mais pour le dépôt interne, tout ce que j'ai à faire est de définir et d'exporter une variable d'environnement supplémentaire:

  • no_proxy=.my.company,localhost,127.0.0.1,::1, pour accéder à n'importe quel référentiel avec une adresse comme myrepo.my.company ou localhost.

Vous pouvez définir NO_PROXY ou no_proxy, ça n'a pas d'importance.

Mais au cas où, je définirais toujours HTTP_PROXY, HTTPS_PROXY, http_proxy, https_proxy, NO_PROXY et no_proxy.

54
VonC

Pour ajouter une autre possibilité, vous pouvez définir un proxy via le git config http.proxy .

git config --global http.proxy http://mydomain\\myusername:mypassword@myproxyserver:proxyport

Mais ce qui est vraiment bien c'est, à partir de git1.8.5 (octobre 2013) , vous pouvez définir les paramètres http par URL .

Le "http.* "les variables peuvent maintenant être spécifiées par URL que la configuration applique .
Par exemple,

[http]
   sslVerify = true
[http "https://weak.example.com/"]
   sslVerify = false

retournerait http.sslVerify désactivé uniquement lorsque vous parlez à ce site spécifié.


Voir commit d4770964d5 :

$ git config --bool --get-urlmatch http.sslVerify https://good.example.com
true
$ git config --bool --get-urlmatch http.sslVerify https://weak.example.com
false

Avec seulement <section> spécifié, vous pouvez obtenir une liste de toutes les variables de la section avec leurs valeurs qui s'appliquent à l'URL donnée. Par exemple

$ git config --get-urlmatch http https://weak.example.com
http.sslverify false

Tous les détails sont dans commit 6a56993b :

http.<url>.*::

Chacune des options http. * Ci-dessus peut être appliquée de manière sélective à certaines URL.
Pour qu'une clé de configuration corresponde à une URL, chaque élément de la clé de configuration est comparé à celui de l'URL, dans l'ordre suivant:

  • Schéma (par exemple, https in https://example.com/).
  • Nom d'hôte/domaine (par exemple, example.com dans https://example.com/).
  • Numéro de port (par exemple, 8080 dans http://example.com:8080/).
  • Chemin (par exemple, repo.git dans https://example.com/repo.git).
  • Nom d'utilisateur (par exemple, user in https://[email protected]/repo.git)

La liste ci-dessus est classée par ordre décroissant de priorité; une URL qui correspond au chemin d'une clé de configuration est préférée à celle qui correspond à son nom d'utilisateur.
Par exemple, si l'URL est https://[email protected]/foo/bar une correspondance de clé de configuration de https://example.com/foo sera préféré à une correspondance de clé de configuration de https://[email protected].

Toutes les URL sont normalisées avant de tenter toute correspondance (la partie mot de passe, si elle est intégrée dans l'URL, est toujours ignorée à des fins de correspondance) afin que les URL équivalentes simplement orthographiées différemment correspondent correctement.

Les paramètres des variables d'environnement remplacent toujours toutes les correspondances .
Les URL qui sont comparées sont celles données directement aux commandes Git.
Cela signifie que les URL + visitées à la suite d'une redirection ne participent pas à la correspondance.

61
VonC

Comme certains l'ont mentionné ici, vous pouvez le faire en spécifiant une URL avec les paramètres de proxy, mais voici le cas d'utilisation qui a résolu ce problème pour moi. Merci à VonC ci-dessus!

Notez ci-dessous que je spécifie la racine du serveur Git. Le chemin complet vers le dépôt git que vous avez cloné n'est pas requis. Vous pouvez utiliser une seule entrée pour prendre soin de l'ensemble du serveur.

Ajoutez ce qui suit à votre fichier .gitconfig. Sur mon système Windows, j'utilise% userprofile% \. Gitconfig

[http]
    proxy = http://my.proxy.net:8080
[https]
    proxy = http://my.proxy.net:8443
[http "http://my.internalgitserver.com/"]
    proxy = ""
32
Artif3x

Vous pouvez ajuster spécifiquement différentes options de configuration pour chaque télécommande. Disons que nous avons 2 télécommandes, nommées Origin et upstream respectivement. Vous ajustez le proxy pour chacun en procédant comme suit:

git config --path remote.Origin.proxy http://user:pass@proxy_for_Origin:8080
git config --path remote.upstream.proxy http://user:pass@proxy_for_upstream:8080

Cela changera les sections de chaque télécommande à l'intérieur de votre configuration dépôt local (.git/config).

Vous pouvez également ajuster les options configuration globale si vous le souhaitez. Puisqu'il n'est pas logique de référencer un nom distant dans le fichier de configuration global ($HOME/.gitconfig), vous pouvez utiliser correspondance d'url (IIRC, pris en charge depuis Git 1.8.5). Exemple:

[http "https://example.com/repo1.git"]
    proxy = http://user:pass@proxy1:8080
[http "https://example.com/repo2.git"]
    proxy = http://user:pass@proxy2:8080

Si vous voulez voir ce qui a été défini:

git config --path --get-urlmatch https://example.com/repo1.git
git config --path --get-urlmatch https://example.com/repo2.git
13
jweyrich

J'ai eu un problème similaire, où je suis derrière mon mandataire d'entreprise. J'ai essentiellement deux types de référentiels:

  1. Externe - qui a besoin d'un proxy
  2. Interne - qui n'a pas besoin de proxy

J'ai dû définir un proxy dans la configuration globale, qui agirait par défaut, sauf indication contraire dans la configuration locale.

Voici donc les commandes de configuration:

définir la configuration globale avec proxy

git config --global --add http.proxy "http://username:password@proxydomain:port"
git config --global --add https.proxy "https://username:password@proxydomain:port"

puis déplacez-vous vers votre répertoire local qui contient votre dossier .git et pour lequel vous n'avez pas besoin de proxy

cd "C:\Users\username\directory_without_proxy\"

définir la configuration locale avec un proxy vide

git config --local --add http.proxy ""
git config --local --add https.proxy ""

Cela pourrait aussi se faire dans l'autre sens. Autrement dit, vous conservez la configuration globale en tant que configuration locale vide et avec vos paramètres de proxy.

Juste pour vérifier, vous pouvez utiliser la commande ci-dessous pour répertorier les paramètres de configuration pour global et local respectivement:

git config --global --list
git config --local --list
0
Anurag Singh