git: // protocole bloqué par l'entreprise, comment puis-je contourner ce problème?

190

Tenter quelque chose comme git clone git://github.com/ry/node.gitne fonctionnera pas, cela se traduit par:

Initialized empty Git repository in /home/robert/node/.git/
github.com[0: 207.97.227.239]: errno=Connection timed out
fatal: unable to connect a socket (Connection timed out)

Cependant, le clonage via HTTP fonctionne correctement. Jusqu'à présent, j'ai compris que c'était un problème avec le protocole, mais j'essaie d'installer cloud9 qui nécessite la commande

git submodule update --init --recursive

qui essaie d'utiliser le protocole git: // et échoue. Existe-t-il un moyen de changer le fonctionnement de cette commande ou quelque chose?

Robert
la source
avez-vous un accès SSH? ou simplement HTTP?
Pablo Santa Cruz le
57
Qu'y a-t-il avec les gens qui essaient de fermer les questions git? Selon la FAQ, le champ d'application de la SO inclut «les outils logiciels couramment utilisés par les programmeurs». Il y a plus de six mille questions git ici. Ils appartiennent ici.
Cascabel
10
Vous pouvez demander à Git d'utiliser automatiquement https: // chaque fois qu'il voit une URL git: //:git config --global url.https://.insteadOf git://
WildlyInaccurate

Réponses:

430

S'il s'agit d'un problème avec votre pare-feu bloquant le port git: protocol (9418), vous devriez alors apporter une modification plus persistante afin de ne pas avoir à vous rappeler d'émettre les commandes suggérées par d'autres articles pour chaque dépôt git.

La solution ci-dessous fonctionne également uniquement pour les sous-modules qui pourraient également utiliser le protocole git :.

Puisque le message git ne pointe pas vraiment immédiatement vers le port de blocage du pare-feu 9418, essayons de diagnostiquer cela comme le problème réel.

Diagnostiquer le problème

Références: https://superuser.com/q/621870/203918 et https://unix.stackexchange.com/q/11756/57414

Il existe plusieurs outils que nous pouvons utiliser pour déterminer si le pare-feu est à l'origine de notre problème - utilisez celui qui est installé sur votre système.

# Using nmap
# A state of "filtered" against port 9418 (git) means
#   that traffic is being filtered by a firewall
$ nmap github.com -p http,git

Starting Nmap 5.21 ( http://nmap.org ) at 2015-01-21 10:55 ACDT
Nmap scan report for github.com (192.30.252.131)
Host is up (0.24s latency).
PORT     STATE    SERVICE
80/tcp   open     http
9418/tcp filtered git

# Using Netcat:
# Returns 0 if the git protocol port IS NOT blocked
# Returns 1 if the git protocol port IS blocked
$ nc github.com 9418 < /dev/null; echo $?
1

# Using CURL
# Returns an exit code of (7) if the git protocol port IS blocked
# Returns no output if the git protocol port IS NOT blocked
$ curl  http://github.com:9418
curl: (7) couldn't connect to host

OK, maintenant nous avons déterminé que notre port git était bloqué par un pare-feu, que pouvons-nous faire? Continuer à lire :)

Réécriture d'URL de base

Git fournit un moyen de réécrire les URL à l'aide de git config. Exécutez simplement la commande suivante:

git config --global url."https://".insteadOf git://

Maintenant, comme par magie, toutes les commandes git effectueront une substitution de git://tohttps://

Quels changements cette commande a-t-elle apportés?

Jetez un œil à votre configuration globale en utilisant:

git config --list

Vous verrez la ligne suivante dans la sortie:

url.https://.insteadof=git://

Vous pouvez voir à quoi cela ressemble sur fichier, en jetant un coup d'œil à l' ~/.gitconfigendroit où vous devriez maintenant voir que les deux lignes suivantes ont été ajoutées:

[url "https://"]
    insteadOf = git://

Vous voulez plus de contrôle?

Utilisez simplement une URL plus complète / spécifique dans le remplacement. Par exemple, pour que seules les URL GitHub utilisent https: // au lieu de git: //, vous pouvez utiliser quelque chose comme:

git config --global url."https://github".insteadOf git://github

Vous pouvez exécuter cette commande plusieurs fois en utilisant différents remplacements. Cependant, dans le cas où une URL correspond à plusieurs remplacements, la correspondance la plus longue "l'emporte". Un seul remplacement sera effectué par URL.

Modifications à l'échelle du système pour les administrateurs système

Si vous êtes un administrateur système Linux et que vous ne voulez pas que vos utilisateurs aient à subir les difficultés ci-dessus, vous pouvez effectuer un changement rapide de configuration git à l'échelle du système.

Modifiez ou ajoutez simplement le contenu suivant /etc/gitconfiget voila vos utilisateurs n'ont pas à se soucier de tout ce qui précède:

[url "https://"]
    insteadOf = git://
Nathan S. Watson-Haigh
la source
9
Brillante simplicité!
Lance Hunt
Fonctionne très bien! Plus besoin de rechercher et de remplacer. Les scripts de création fonctionnent maintenant. Cette réponse m'a fait gagner beaucoup de temps. Merci!
Jeremy Bell
8
Pour un peu plus de contrôle sur l'URL convertie, vous pouvez également spécifier une partie de l'URL. Par exemple: j'ai un serveur interne privé 'myserver.lan.example.com' qui héberge git repos sur SSH (gitlab) mais pas HTTPS. Par conséquent, je dois utiliser SSH si je veux profiter d'une authentification par clé pratique. J'utilise également des dépôts de Github, mais mon pare-feu d'entreprise bloque SSH vers Github. Je ne veux pas simplement remplacer toutes les instances de 'git: //' par 'https: //' car cela casserait gitlab. La solution est git config --global url."https://github".insteadOf git://github.
clayzermk1
2
J'exécutais git depuis l'intérieur de cygwin et la seule façon dont je pouvais faire fonctionner cela était de faire les 'Changements à l'échelle du système pour les administrateurs système' et d'ajouter les changements 'url.https: //.insteadof=git: //' à le fichier 'C: \ Program Files (x86) \ Git \ etc \ gitconfig'. Merci pour l'indice!
Craig
4
Pour annuler ce changement, on peut utilisergit config --global --unset url."https://".insteadOf
djskinner
29

Github fournit également un accès http (s), qui est beaucoup moins susceptible d'être bloqué par votre entreprise. Pour dire au sous-module d'utiliser cela, vous pouvez faire ceci:

git submodule init
git config submodule.<name>.url https://github.com/...
git submodule update

C'est en fait exactement pourquoi init et update sont des commandes séparées - vous pouvez initier, personnaliser les emplacements, puis mettre à jour. update --initest juste un raccourci lorsque vous n'avez pas besoin de personnaliser d'URL.

Pour toute autre personne qui rencontre cela, vous pouvez bien sûr également utiliser une URL ssh (si votre entreprise bloque git: // mais pas ssh), mais dans ce cas, l'OP n'a probablement pas d'accès SSH au dépôt distant.

Cascabel
la source
On dirait que cela fonctionnera probablement pour moi, bien qu'il semble que je doive passer par chacun d'eux individuellement. Je faisais github.com/ajaxorg/cloud9 spécifiquement si cela compte.
Robert
4
@ Robert: S'il y a beaucoup, vous pouvez modifier le fichier de configuration directement et effectuez une recherche et remplacer: sed -i 's@git://github@https://github@' .git/config.
Cascabel
Hmm, pour une raison quelconque, ils disent http: // dans le fichier, mais la commande essaie toujours git: //
Robert
1
J'ai le même problème décrit dans l'OP, mais lorsque j'utilise cette solution, cela échoue toujours, mais avec une erreur légèrement différente. Il dit "erreur: lors de l'accès à https: // ... fatal: la requête HTTP a échoué" Quelqu'un a-t-il un aperçu de cela? Mon hôte bloque-t-il quelque chose? Mes autres sous-modules se mettent à jour correctement, je n'ai des problèmes qu'avec un seul.
Jo Sprague
14

Une autre option qui n'implique pas de toucher git config est de changer les paramètres ssh pour utiliser le port 443 au lieu du port 22 normal.

Référence: Utilisation de SSH sur le port HTTPS

De cet article:

edit the file at ~/.ssh/config, and add this section:

Host github.com
   Hostname ssh.github.com   
   Port 443

Ensuite, j'ai pu réussir à git push sur Github. À la maison, vous pouvez revenir à la configuration ssh telle qu'elle était si vous le souhaitez.

elpddev
la source
7

J'avais aussi le même problème pendant un certain temps. Ensuite, j'ai essayé de changer la configuration de git en utilisant la commande suggérée:

git config --global url."https://".insteadOf git://

qui malheureusement n'a pas fait l'affaire pour moi . J'avais toujours le même problème!

Ce qui a finalement résolu mon problème, c'est que j'ai réinitialisé à nouveau l'URL distante de mon référentiel à l'aide de la commande suivante:

git remote set-url origin https://github.com/<my_user_name>/<my_repo_name>.git

qui était auparavant comme ceci:

git remote set-url origin [email protected]:<my_user_name>/<my_repo_name>.git

Après avoir défini l'URL distante à la https://place, [email protected]le problème a été résolu pour moi.

KM Rakibul Islam
la source
1
J'ai rencontré un problème similaire. Il semble que la définition du global n'affecte que les dépôts clonés à l'avenir, et ne change rien rétroactivement.
Taylor Edmiston
2

En développant la réponse de Nathan ci-dessus, vous pouvez également essayer le protocole ssh si votre pare-feu d'entreprise interfère avec https. Dans mon cas, le pare-feu bloquait le protocole git, réémettait des certificats ssl pour https et cela cassait le bower pour moi, même avec l'option strict-ssl désactivée. Vous pouvez faire une réécriture d'url similaire pour ssh et créer une clé / paire ssh comme décrit sur github .

 git config --global url."ssh://[email protected]".insteadOf git://github.com

Vous devrez également activer l'agent ssh pour votre installation git.

jhiller
la source
1

c'est parce que l'adresse GIT du serveur de nœuds a changé que vous devez saisir maintenant:

git clone https://github.com/joyent/node

bonne chance

fmo
la source
6
Cette question datait de février, lorsque l'URL ci-dessus était valide.
Robert le
@calccrypto le lien fait partie d'une commande qui n'est pas balisée en code, ce n'est pas censé être un lien vers des informations.
Mike Precup
0

introduction

J'ajouterai ici ma propre approche ( ce qui n'est pas obligatoire si vous avez un référentiel git accessible au public qui prend en charge https ).

Je travaille dans une entreprise où le référentiel git n'est accessible que de l'intérieur de l'entreprise. Mais je travaille aussi à domicile.

Comment puis-je pousser vers le référentiel de l'entreprise depuis chez moi?

J'ai créé un référentiel avec un dossier sur mon lecteur Google. À l'exception de git et https, vous pouvez inclure des référentiels en tant que chemins.

entrez la description de l'image ici

Donc, au lieu de pousser vers l'origine, je pousse sur "gDrive". Cela provoque la synchronisation du dossier de ma station de travail domestique vers Google Drive, puis mon ordinateur de travail extrait les modifications. De plus, comme parfois les fichiers du répertoire ".git" ne se synchronisent pas, je renomme temporairement le dossier de "trunk" par exemple à "trunk2". Cela oblige les ordinateurs personnels et professionnels à être synchronisés à 100% avec Google Drive.

Je me connecte ensuite à mon ordinateur de travail via checkpoint-vpn remote (ou teamviewer) et je pousse mes mises à jour vers le référentiel de travail git.

De plus, le processus fonctionnerait vice-versa pour pousser vers un référentiel git en dehors de l'entreprise qui est bloqué.

  1. Poussez du dépôt git du poste de travail vers le dossier de Google Drive.
  2. Forcez la synchronisation à 100% en renommant temporairement le répertoire du projet dans gDrive.
  3. Accédez à l'ordinateur personnel via une sorte de modifications à distance et push.
Prime optimale
la source