git: // protocolo bloqueado por la empresa, ¿cómo puedo evitar eso?

188

Intentar algo así git clone git://github.com/ry/node.gitno funcionará, da como resultado:

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)

Sin embargo, la clonación sobre HTTP funciona bien. Hasta ahora he deducido que es un problema con el protocolo, pero estoy tratando de instalar cloud9 que requiere el comando

git submodule update --init --recursive

que intenta usar el protocolo git: // y falla. ¿Hay alguna manera de cambiar cómo funcionará ese comando o algo así?

Robert
fuente
¿tienes acceso SSH? o solo HTTP?
Pablo Santa Cruz
56
¿Qué pasa con las personas que intentan cerrar preguntas git? Según las preguntas frecuentes, el alcance de SO incluye "herramientas de software comúnmente utilizadas por los programadores". Hay más de seis mil preguntas git aquí. Ellos pertenecen aquí.
Cascabel
9
Puede hacer que Git use automáticamente https: // cada vez que vea un git: // URL:git config --global url.https://.insteadOf git://
WildlyInaccurate

Respuestas:

426

Si este es un problema con su firewall bloqueando el puerto git: protocol (9418), entonces debe hacer un cambio más persistente para que no tenga que acordarse de emitir comandos sugeridos por otras publicaciones para cada repositorio git.

La siguiente solución también funciona para submódulos que también podrían estar usando el protocolo git:.

Dado que el mensaje git realmente no apunta inmediatamente al firewall que bloquea el puerto 9418, intentemos diagnosticar esto como el problema real.

Diagnosticando el problema

Referencias: https://superuser.com/q/621870/203918 y https://unix.stackexchange.com/q/11756/57414

Hay varias herramientas que podemos usar para determinar si el firewall está causando nuestro problema: use la que esté instalada en su sistema.

# 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

Bien, ahora que hemos determinado que nuestro firewall está bloqueado por un firewall, ¿qué podemos hacer al respecto? Sigue leyendo :)

Reescritura básica de URL

Git proporciona una forma de reescribir URL usando git config. Simplemente emita el siguiente comando:

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

Ahora, como por arte de magia, todos los comandos git realizarán una sustitución de git://ahttps://

¿Qué cambios hizo este comando?

Eche un vistazo a su configuración global utilizando:

git config --list

Verá la siguiente línea en la salida:

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

Puede ver cómo se ve esto en el archivo, echando un vistazo a ~/.gitconfigdónde debería ver ahora que se han agregado las siguientes dos líneas:

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

¿Quieres más control?

Simplemente use una URL más completa / específica en el reemplazo. Por ejemplo, para que solo las URL de GitHub usen https: // en lugar de git: //, puede usar algo como:

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

Puede ejecutar este comando varias veces utilizando diferentes reemplazos. Sin embargo, en el caso de que una URL coincida con múltiples reemplazos, la coincidencia más larga "gana". Solo se realizará un reemplazo por URL.

Cambios en todo el sistema para administradores de sistemas

Si eres un administrador de sistemas Linux y no quieres que tus usuarios tengan que pasar por los dolores anteriores, puedes hacer un cambio rápido de configuración de git en todo el sistema.

Simplemente edite o agregue los siguientes contenidos /etc/gitconfigy listo, sus usuarios no tienen que preocuparse por nada de lo anterior:

[url "https://"]
    insteadOf = git://
Nathan S. Watson-Haigh
fuente
9
Brillante simplicidad!
Lance Hunt
¡Funciona genial! No más búsqueda y reemplazo. Crear scripts solo funciona ahora. Esta respuesta me ahorró mucho tiempo. ¡Gracias!
Jeremy Bell
77
Para tener un poco más de control de qué URL se convierte, también puede especificar parte de la URL. Por ejemplo: tengo un servidor interno privado 'myserver.lan.example.com' que aloja repositorios git sobre SSH (gitlab) pero no HTTPS. Por lo tanto, debo usar SSH si quiero aprovechar la conveniente autenticación de clave. También uso repositorios de Github, pero mi firewall corporativo bloquea SSH a Github. No quiero simplemente reemplazar todas las instancias de 'git: //' con 'https: //' ya que eso rompería gitlab. La solución es git config --global url."https://github".insteadOf git://github.
clayzermk1
2
Estaba ejecutando git desde el interior de cygwin y la única forma en que podía hacer que esto funcionara era haciendo los 'Cambios en todo el sistema para los administradores de sistemas' y agregando los cambios 'url.https: //.insteadof=git: //' a el archivo 'C: \ Archivos de programa (x86) \ Git \ etc \ gitconfig'. ¡Gracias por la pista!
Craig
3
Para deshacer este cambio se puede usargit config --global --unset url."https://".insteadOf
djskinner
29

Github también proporciona acceso a http (s), que es mucho menos probable que sea bloqueado por su empresa. Para decirle al submódulo que use eso, puede hacer esto:

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

Esto es exactamente por qué init y update son comandos separados: puede iniciar, personalizar ubicaciones y luego actualizar. update --inites solo un acceso directo para cuando no necesite personalizar ninguna URL.

Para cualquier otra persona que pase por esto, también podría usar una URL ssh (si su empresa bloquea git: // pero no ssh), pero en este caso el OP presumiblemente no tiene acceso SSH al repositorio remoto.

Cascabel
fuente
Parece que esto probablemente funcionará para mí, aunque parece que tendré que revisar cada uno individualmente. Estaba haciendo github.com/ajaxorg/cloud9 específicamente si eso importa.
Robert
44
@ Robert: Si hay una gran cantidad, se puede editar el archivo de configuración directamente y hacer una búsqueda y reemplazo: sed -i 's@git://github@https://github@' .git/config.
Cascabel
Hmm, por alguna razón dicen http: // en el archivo, pero el comando todavía intenta git: //
Robert
1
Tengo el mismo problema descrito en el OP, pero cuando uso esta solución, todavía falla, pero con un error ligeramente diferente. Dice "error: al acceder a https: // ... fatal: la solicitud HTTP falló" ¿Alguien tiene alguna idea sobre esto? ¿Mi host está bloqueando algo? Mis otros submódulos se actualizan bien, solo estoy teniendo problemas con uno.
Jo Sprague
13

Otra opción que no implica tocar git config es cambiar la configuración de ssh para usar el puerto 443 en lugar del puerto 22 normal.

Referencia: Uso de SSH sobre el puerto HTTPS

De ese artículo:

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

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

Después, pude exitosamente darle un empujón a Github. En casa, puede volver a cambiar la configuración de ssh a la forma en que era si lo desea.

elpddev
fuente
7

También tuve el mismo problema por un tiempo. Luego intenté cambiar la configuración de git usando el comando sugerido:

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

que desafortunadamente no me sirvió . ¡Todavía tenía el mismo problema!

Lo que realmente resolvió mi problema al fin es que he restablecido la URL remota de mi repositorio nuevamente usando el siguiente comando:

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

que anteriormente era así:

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

Después de configurar la URL remota usando en https://lugar del [email protected]problema, se resolvió para mí.

KM Rakibul Islam
fuente
1
Experimenté un problema similar. Parece que establecer el global solo afecta a los repos clonados en el futuro, y no cambia ninguno retroactivamente.
Taylor Edmiston
2

Ampliando la respuesta anterior de Nathan, también puede probar el protocolo ssh si su firewall corporativo está interfiriendo con https. En mi caso, el firewall estaba bloqueando el protocolo git, volviendo a emitir certificados SSL para https y esto me estaba rompiendo la confianza, incluso con la opción estricta-SSL desactivada. Puede hacer una reescritura de URL similar para ssh y crear una clave / par ssh como se describe en github .

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

También debería activar el ssh-agent para su instalación de git.

jhiller
fuente
1

es porque la dirección GIT para el servidor de nodo ha cambiado, debe ingresar ahora:

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

buena suerte

fmo
fuente
66
Esta pregunta era de febrero, cuando lo anterior era la URL válida.
Robert
@calccrypto el enlace es parte de un comando que no está etiquetado con código, no está destinado a ser un enlace a la información.
Mike Precup
0

Introducción

Agregaré aquí mi propio enfoque ( que no es necesario si tiene un repositorio git de acceso público que admita https ).

Trabajo en una empresa donde solo se puede acceder al repositorio git desde dentro de la empresa. Pero también trabajo desde casa.

¿Cómo llego al repositorio de la empresa desde casa?

He creado un repositorio con una carpeta en mi unidad de google. Excepto git y https, puede incluir repositorios como rutas.

ingrese la descripción de la imagen aquí

Entonces, en lugar de presionar al origen, presiono a "gDrive". Esto hace que la carpeta se sincronice desde la estación de trabajo de mi casa a la unidad de Google, y luego mi computadora de trabajo extrae los cambios. Además, dado que a veces los archivos en el directorio ".git" no se sincronizan, cambio el nombre de la carpeta temporalmente de, por ejemplo, "trunk" a "trunk2". Esto obliga a que tanto las computadoras del hogar como las del trabajo estén 100% sincronizadas con Google Drive.

Luego inicio sesión en mi computadora de trabajo a través de checkpoint-vpn remote (o teamviewer) y envío mis actualizaciones al repositorio de trabajo git.

Además, el proceso funcionaría viceversa para empujar a un repositorio git fuera de la empresa que está bloqueado.

  1. Presione desde la estación de trabajo git repo a la carpeta en google drive.
  2. Fuerce la sincronización al 100% renombrando temporalmente el directorio del proyecto en gDrive.
  3. Acceda a la computadora del hogar a través de algún tipo de control remoto y presione los cambios.
Menios
fuente