git: // protocolo bloqueado pela empresa, como posso contornar isso?

188

Tentar algo como git clone git://github.com/ry/node.gitnão funcionará, resultará em:

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)

No entanto, a clonagem por HTTP funciona bem. Até agora entendi que é um problema com o protocolo, mas estou tentando instalar o cloud9, que está exigindo o comando

git submodule update --init --recursive

que está tentando usar o protocolo git: // e está com falha. Existe uma maneira de mudar como esse comando funcionará ou algo assim?

Robert
fonte
você tem acesso SSH? ou apenas HTTP?
Pablo Santa Cruz
56
O que há com as pessoas tentando fechar perguntas do Git? De acordo com o FAQ, o escopo do SO inclui "ferramentas de software comumente usadas por programadores". Existem mais de seis mil perguntas importantes aqui. Eles pertencem aqui.
Cascabel
9
Você pode fazer o Git usar automaticamente https: // sempre que vir um git: // URL:git config --global url.https://.insteadOf git://
WildlyInaccurate

Respostas:

426

Se esse é um problema com o firewall bloqueando a porta git: protocol (9418), faça uma alteração mais persistente para não ter que se lembrar de emitir comandos sugeridos por outras postagens para cada repositório git.

A solução abaixo também funciona apenas para submódulos que também podem estar usando o protocolo git:

Como a mensagem git realmente não aponta imediatamente para a porta de bloqueio do firewall 9418, vamos tentar diagnosticar isso como o problema real.

Diagnosticando o problema

Referências: https://superuser.com/q/621870/203918 e https://unix.stackexchange.com/q/11756/57414

Existem várias ferramentas que podemos usar para determinar se o firewall está causando o nosso problema - use o que estiver instalado no seu 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, agora determinamos que nossa porta git está sendo bloqueada por um firewall, o que podemos fazer? Leia :)

Reescrita básica de URL

O Git fornece uma maneira de reescrever URLs usando git config. Basta emitir o seguinte comando:

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

Agora, como que por mágica, todos os comandos git farão uma substituição de git:// parahttps://

Que mudanças este comando fez?

Dê uma olhada na sua configuração global usando:

git config --list

Você verá a seguinte linha na saída:

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

Você pode ver como isso fica registrado, dando uma olhada em ~/.gitconfigonde você deve ver agora que as duas linhas a seguir foram adicionadas:

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

Quer mais controle?

Basta usar um URL mais completo / específico na substituição. Por exemplo, para ter apenas URLs do GitHub use https: // em vez de git: //, você pode usar algo como:

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

Você pode executar este comando várias vezes usando substituições diferentes. No entanto, no caso de um URL corresponder a várias substituições, a correspondência mais longa "vence". Apenas uma única substituição será feita por URL.

Alterações em todo o sistema para administradores de sistemas

Se você é um administrador de sistema Linux e não deseja que seus usuários passem pelas dificuldades acima, você pode fazer uma alteração rápida na configuração do git em todo o sistema.

Simplesmente edite ou adicione o seguinte conteúdo /etc/gitconfige pronto, seus usuários não precisam se preocupar com nenhum dos itens acima:

[url "https://"]
    insteadOf = git://
Nathan S. Watson-Haigh
fonte
9
Simplicidade brilhante!
Lance caça
Funciona bem! Não há mais pesquisa e substituição. Os scripts de compilação funcionam agora. Essa resposta me salvou muito tempo. Obrigado!
Jeremy Bell
7
Para um pouco mais de controle de qual URL é convertido, você também pode especificar parte do URL. Por exemplo: Eu tenho um servidor interno privado 'myserver.lan.example.com' que hospeda repositórios git sobre SSH (gitlab), mas não HTTPS. Portanto, eu preciso usar SSH se eu quiser tirar vantagem da autenticação de chave conveniente. Também uso repositórios do Github, mas meu firewall corporativo bloqueia o SSH no Github. Eu não quero simplesmente substituir todas as instâncias de 'git: //' por 'https: //', pois isso quebraria o gitlab. A solução é git config --global url."https://github".insteadOf git://github.
clayzermk1
2
Eu estava executando o git dentro do cygwin e a única maneira de fazê-lo funcionar era fazendo as 'Alterações em todo o sistema para administradores de sistemas' e adicionando as alterações 'url.https: //.insteadof=git: //' em o arquivo 'C: \ Arquivos de Programas (x86) \ Git \ etc \ gitconfig'. Obrigado pela dica!
Craig
3
Para desfazer essa alteração pode-se usargit config --global --unset url."https://".insteadOf
djskinner
29

O Github também fornece acesso http (s), o que é muito menos provável de ser bloqueado pela sua empresa. Para dizer ao submódulo para usar isso, você pode fazer o seguinte:

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

Na verdade, é exatamente por isso que init e update são comandos separados - você pode iniciar, personalizar locais e atualizar. update --inité apenas um atalho para quando você não precisa personalizar nenhum URL.

Para qualquer outra pessoa que depare com isso, é claro que você também pode usar um URL ssh (se sua empresa bloquear o git: //, mas não o ssh), mas nesse caso o OP presumivelmente não tem acesso SSH ao repositório remoto.

Cascabel
fonte
Parece que isso provavelmente funcionará para mim, embora pareça que vou ter que passar por cada um individualmente. Estava fazendo github.com/ajaxorg/cloud9 especificamente se isso importa.
Robert
4
@ Robert: Se há um monte, você pode editar o arquivo de configuração diretamente e fazer uma pesquisa e substituir: sed -i 's@git://github@https://github@' .git/config.
Cascabel
Hmm, por algum motivo, eles dizem http: // no arquivo, mas o comando ainda tenta o git: //
Robert
1
Estou tendo o mesmo problema descrito no OP, mas quando uso essa solução, ela ainda falha, mas com um erro ligeiramente diferente. Ele diz "erro: ao acessar https: // ... fatal: a solicitação HTTP falhou" Alguém tem alguma idéia sobre isso? Meu host está bloqueando alguma coisa? Meus outros submódulos são atualizados, só estou tendo problemas com um.
precisa saber é o seguinte
13

Outra opção que não envolve tocar na configuração do git é alterar as configurações do ssh para usar a porta 443 em vez da porta 22 normal.

Referência: Usando SSH pela porta HTTPS

Desse artigo:

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

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

Posteriormente, consegui git push com sucesso no Github. Em casa, você pode alterar a configuração do ssh da maneira que estava, se quiser.

elpddev
fonte
7

Eu também estava tendo o mesmo problema por um tempo. Então tentei alterar a configuração do git usando o comando sugerido:

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

que infelizmente não fez o truque para mim . Eu ainda estava tendo o mesmo problema!

O que realmente resolveu meu problema, finalmente, é que redefini o URL remoto do meu repositório novamente usando o seguinte comando:

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

que era anteriormente assim:

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

Depois de definir o URL remoto usando em https://vez do [email protected]problema foi resolvido para mim.

KM Rakibul Islam
fonte
1
Eu tive um problema semelhante. Parece que definir o global afeta apenas os repositórios clonados daqui para frente e não muda retroativamente.
Taylor Edmiston #
2

Expandindo a resposta de Nathan acima, você também pode tentar o protocolo ssh se o firewall corporativo estiver interferindo no https. No meu caso, o firewall estava bloqueando o protocolo git, reemitindo certificados ssl para https e isso estava atrapalhando a minha vida, mesmo com a opção strict-ssl desativada. Você pode reescrever um URL semelhante para o ssh e criar um par / chave ssh conforme descrito no github .

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

Você também teria que ativar o ssh-agent para sua instalação do git.

jhiller
fonte
1

é porque o endereço GIT para o servidor do nó mudou, você deve inserir agora:

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

boa sorte

fmo
fonte
6
Esta pergunta foi de fevereiro, quando o URL acima era válido.
Robert
@calccrypto o link faz parte de um comando que não é codificado, não serve para ser um link para informações.
Mike Precup
0

Introdução

Vou adicionar aqui minha própria abordagem ( que não é necessária se você tiver um repositório git acessível ao público que suporte https ).

Eu trabalho em uma empresa onde o repositório git é acessível apenas de dentro da empresa. Mas eu também trabalho em casa.

Como envio para o repositório da empresa a partir de casa?

Eu criei um repositório com uma pasta no meu google drive. Exceto para git e https, você pode incluir repositórios como caminhos.

insira a descrição da imagem aqui

Então, em vez de pressionar para a origem, pressiono para "gDrive". Isso faz com que a pasta seja sincronizada da minha estação de trabalho doméstica para o Google Drive e, em seguida, o computador do trabalho faz as alterações. Além disso, como às vezes os arquivos no diretório ".git" não são sincronizados, renomeio a pasta temporariamente de, por exemplo, "tronco" para "tronco2". Isso força os computadores domésticos e profissionais a serem 100% sincronizados com o Google Drive.

Em seguida, faço logon no meu computador de trabalho por meio do checkpoint-vpn remote (ou teamviewer) e envio minhas atualizações para o repositório work git.

Além disso, o processo funcionaria vice-versa para enviar para um repositório git fora da empresa bloqueada.

  1. Envie da estação de trabalho git repo para a pasta no Google Drive.
  2. Força 100% de sincronização renomeando temporariamente o diretório do projeto no gDrive.
  3. Acesse o computador doméstico através de algum tipo de controle remoto e faça alterações por push.
Menios
fonte