git: // protocollo bloccato dall'azienda, come posso aggirarlo?


188

Tentare qualcosa come git clone git://github.com/ry/node.gitnon funzionerà, si tradurrà in:

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)

Tuttavia, la clonazione su HTTP funziona bene. Finora ho capito che si tratta di un problema con il protocollo, ma sto cercando di installare cloud9 che richiede il comando

git submodule update --init --recursive

che sta cercando di usare il protocollo git: // e fallisce. C'è un modo per cambiare il modo in cui quel comando funzionerà o qualcosa del genere?


hai accesso SSH? o solo HTTP?
Pablo Santa Cruz,

56
Cosa succede alle persone che cercano di chiudere domande git? Secondo le FAQ, lo scopo di SO include "strumenti software comunemente usati dai programmatori". Ci sono oltre seimila domande git qui. Appartengono qui.
Cascabel,

9
Puoi fare in modo che Git usi automaticamente https: // ogni volta che vede un git: // URL:git config --global url.https://.insteadOf git://
WildlyInaccurate

Risposte:


426

Se questo è un problema con il firewall che blocca git: protocol port (9418), allora dovresti apportare una modifica più persistente in modo da non dover ricordare di emettere i comandi suggeriti da altri post per ogni repository git.

La soluzione di seguito funziona anche con i sottomoduli che potrebbero anche usare il protocollo git :.

Dal momento che il messaggio git in realtà non punta immediatamente alla porta di blocco del firewall 9418, proviamo a diagnosticare questo come il problema reale.

Diagnosi del problema

Riferimenti: https://superuser.com/q/621870/203918 e https://unix.stackexchange.com/q/11756/57414

Esistono diversi strumenti che è possibile utilizzare per determinare se il firewall causa il nostro problema: utilizzare quello che è installato sul 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

OK, quindi ora abbiamo stabilito che la nostra porta git è bloccata da un firewall, cosa possiamo fare al riguardo? Continuare a leggere :)

Riscrittura URL di base

Git fornisce un modo per riscrivere gli URL usando git config. Emetti semplicemente il seguente comando:

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

Ora, come per magia, tutti i comandi Git si esibiranno una sostituzione di git://ahttps://

Quali modifiche ha apportato questo comando?

Dai un'occhiata alla tua configurazione globale usando:

git config --list

Vedrai la seguente riga nell'output:

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

Puoi vedere come appare questo file, dando un'occhiata a ~/.gitconfigdove ora dovresti vedere che sono state aggiunte le seguenti due righe:

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

Desideri un maggiore controllo?

Usa semplicemente un URL più completo / specifico nella sostituzione. Ad esempio, per avere solo gli URL GitHub utilizzare https: // anziché git: //, è possibile utilizzare qualcosa del tipo:

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

È possibile eseguire questo comando più volte utilizzando sostituzioni diverse. Tuttavia, nel caso in cui un URL corrisponda a più sostituzioni, la corrispondenza più lunga "vince". Verrà effettuata una sola sostituzione per URL.

Modifiche a livello di sistema per amministratori di sistema

Se sei un amministratore di sistema Linux e non vuoi che i tuoi utenti debbano affrontare i problemi di cui sopra, puoi apportare una rapida modifica della configurazione di git a livello di sistema.

Basta modificare o aggiungere i seguenti contenuti /etc/gitconfige voilà i tuoi utenti non devono preoccuparsi di nessuno dei precedenti:

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

9
Semplicità geniale!
Lance Hunt,

Funziona alla grande! Non dovrai più cercare e sostituire. Gli script di build funzionano ora. Questa risposta mi ha fatto risparmiare un sacco di tempo. Grazie!
Jeremy Bell,

7
Per un po 'più di controllo su quale URL viene convertito, puoi anche specificare parte dell'URL. Ad esempio: ho un server interno privato "myserver.lan.example.com" che ospita repository git su SSH (gitlab) ma non HTTPS. Pertanto, io devo usare SSH se voglio approfittare di autenticazione a chiave conveniente. Uso anche i repository di Github, ma il mio firewall aziendale blocca SSH su Github. Non voglio semplicemente sostituire tutte le istanze di 'git: //' con 'https: //' poiché ciò spezzerebbe gitlab. La soluzione è git config --global url."https://github".insteadOf git://github.
clayzermk1,

2
Stavo eseguendo git dall'interno di Cygwin e l'unico modo per farlo funzionare era fare le "Modifiche a livello di sistema per amministratori di sistema" e aggiungere le modifiche "url.https: //.insteadof=git: //" a il file 'C: \ Programmi (x86) \ Git \ etc \ gitconfig'. Grazie per il suggerimento!
Craig,

3
Per annullare questa modifica è possibile utilizzaregit config --global --unset url."https://".insteadOf
djskinner il

29

Github fornisce anche l'accesso agli http, che è molto meno probabile che venga bloccato dalla tua azienda. Per dire al sottomodulo di usarlo, puoi farlo:

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

Questo è esattamente il motivo per cui init e update sono comandi separati: puoi inizializzare, personalizzare le posizioni, quindi aggiornare. update --initè solo una scorciatoia per quando non è necessario personalizzare alcun URL.

Per chiunque altro si verifichi, potresti ovviamente usare anche un URL ssh (se la tua azienda blocca git: // ma non ssh), ma in questo caso l'OP presumibilmente non ha accesso SSH al repository remoto.


Sembra che probabilmente funzionerà per me, anche se sembra che dovrò esaminarli singolarmente. Stavo facendo github.com/ajaxorg/cloud9 specificamente se questo è importante.
Robert,

4
@ Robert: Se ci sono un sacco, è possibile modificare il file di configurazione direttamente e fare una ricerca e sostituzione: sed -i 's@git://github@https://github@' .git/config.
Cascabel,

Hmm, per qualche motivo dicono http: // nel file, ma il comando cerca ancora git: //
Robert

1
Sto riscontrando lo stesso problema descritto nel PO, ma quando uso questa soluzione, non riesce ancora, ma con un errore leggermente diverso. Dice "errore: durante l'accesso a https: // ... fatal: richiesta HTTP non riuscita" Qualcuno ha qualche idea su questo? Il mio host sta bloccando qualcosa? I miei altri sottomoduli si aggiornano bene, ho solo problemi con uno.
Jo Sprague,

13

Un'altra opzione che non comporta il contatto con git config è quella di modificare le impostazioni ssh per usare la porta 443 invece della normale porta 22.

Riferimento: utilizzo di SSH sulla porta HTTPS

Da quell'articolo:

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

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

Successivamente, sono stato in grado di inviare con successo la spinta a Github. A casa puoi tornare indietro con ssh config come volevi.


7

Ho anche avuto lo stesso problema per un po '. Quindi ho provato a cambiare la configurazione di git usando il comando suggerito:

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

che purtroppo non ha funzionato per me . Avevo ancora lo stesso problema!

Alla fine, ciò che ha risolto il mio problema è che ho reimpostato nuovamente l'URL remoto del mio repository usando il comando seguente:

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

che in precedenza era così:

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

Dopo aver impostato l'URL remoto usando https://invece git@git.comil problema è stato risolto per me.


1
Ho riscontrato un problema simile. Sembra che l'impostazione globale influisca solo sui repository clonati in futuro e non cambia retroattivamente.
Taylor Edmiston,

2

Espandendo la risposta di Nathan sopra, puoi anche provare il protocollo ssh se il tuo firewall aziendale interferisce con https. Nel mio caso il firewall stava bloccando il protocollo git, emettendo nuovamente certificati ssl per https e questo mi ha spezzato il potere, anche con l'opzione strict-ssl disattivata. Puoi eseguire una riscrittura dell'URL simile per ssh e creare una chiave / coppia ssh come descritto su github .

 git config --global url."ssh://git@github.com".insteadOf git://github.com

Dovresti anche attivare ssh-agent per la tua installazione di git.


1

è perché l'indirizzo GIT per il server del nodo è cambiato devi inserire ora:

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

in bocca al lupo


6
Questa domanda era di febbraio, quando quanto sopra era l'URL valido.
Robert,

@calccrypto il collegamento fa parte di un comando che non è codificato in codice, non è pensato per essere un collegamento alle informazioni.
Mike Precup,

0

introduzione

Aggiungerò qui il mio approccio ( che non è necessario se si dispone di un repository git accessibile al pubblico che supporta https ).

Lavoro in un'azienda in cui il repository git è accessibile solo dall'interno dell'azienda. Ma lavoro anche da casa.

Come spingo nel repository aziendale da casa?

Ho creato un repository con una cartella sul mio drive google. Ad eccezione di git e https, è possibile includere repository come percorsi.

inserisci qui la descrizione dell'immagine

Quindi, invece di spingere verso l'origine, spingo su "gDrive". Questo fa sì che la cartella si sincronizzi dalla mia workstation di casa con Google Drive, e quindi il mio computer di lavoro tira le modifiche. Inoltre, poiché a volte i file nella directory ".git" non si sincronizzano, rinomino temporaneamente la cartella da ad esempio "trunk" a "trunk2". Ciò impone che i computer di casa e di lavoro vengano sincronizzati al 100% con Google Drive.

Quindi accedo al mio computer di lavoro tramite checkpoint-vpn remote (o teamviewer) e invio i miei aggiornamenti al repository git di lavoro.

Inoltre, il processo funzionerebbe viceversa per il push in un repository git esterno alla società che è bloccato.

  1. Push dalla workstation git repo alla cartella in google drive.
  2. Forza la sincronizzazione al 100% rinominando temporaneamente la directory del progetto in gDrive.
  3. Accedi al computer di casa tramite una sorta di telecomando e invia modifiche.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.