git: // Protokoll von Firma blockiert, wie kann ich das umgehen?

188

Der Versuch, so etwas wie git clone git://github.com/ry/node.gitnicht zu funktionieren, führt zu:

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)

Das Klonen über HTTP funktioniert jedoch einwandfrei. Bisher habe ich festgestellt, dass es sich um ein Problem mit dem Protokoll handelt, aber ich versuche, cloud9 zu installieren, für das der Befehl erforderlich ist

git submodule update --init --recursive

Das versucht, das git: // Protokoll zu verwenden und schlägt fehl. Gibt es eine Möglichkeit zu ändern, wie dieser Befehl funktioniert oder so?

Robert
quelle
Haben Sie SSH-Zugang? oder nur HTTP?
Pablo Santa Cruz
56
Was ist mit Leuten, die versuchen, Git-Fragen zu schließen? Laut FAQ umfasst der Umfang von SO "Software-Tools, die üblicherweise von Programmierern verwendet werden". Hier gibt es über sechstausend Git-Fragen. Sie gehören hierher.
Cascabel
9
Sie können Git dazu bringen, https: // automatisch zu verwenden, wenn ein git: // URL:git config --global url.https://.insteadOf git://
WildlyInaccurate

Antworten:

426

Wenn dies ein Problem mit Ihrer Firewall ist, die den git: protocol-Port (9418) blockiert, sollten Sie eine dauerhaftere Änderung vornehmen, damit Sie nicht daran denken müssen, für jedes git-Repo Befehle auszugeben, die von anderen Posts vorgeschlagen wurden.

Die folgende Lösung funktioniert auch nur für Submodule, die möglicherweise auch das git: -Protokoll verwenden.

Da die Git-Nachricht nicht sofort auf den Firewall-Blockierungsport 9418 verweist, versuchen wir, dies als das eigentliche Problem zu diagnostizieren.

Problem diagnostizieren

Referenzen: https://superuser.com/q/621870/203918 und https://unix.stackexchange.com/q/11756/57414

Es gibt verschiedene Tools, mit denen wir feststellen können, ob die Firewall unser Problem verursacht - verwenden Sie die auf Ihrem System installierte.

# 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, jetzt haben wir festgestellt, dass unser Git-Port von einer Firewall blockiert wird. Was können wir dagegen tun? Weiter lesen :)

Grundlegendes Umschreiben von URLs

Git bietet eine Möglichkeit, URLs mithilfe von neu zu schreiben git config. Geben Sie einfach den folgenden Befehl ein:

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

Jetzt führen alle Git-Befehle wie durch Zauberei eine Ersetzung von git://to durchhttps://

Welche Änderungen hat dieser Befehl vorgenommen?

Sehen Sie sich Ihre globale Konfiguration an mit:

git config --list

In der Ausgabe wird die folgende Zeile angezeigt:

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

Sie können sehen, wie dies in der Datei aussieht, indem Sie einen Blick darauf werfen, ~/.gitconfigwo Sie jetzt sehen sollten, dass die folgenden zwei Zeilen hinzugefügt wurden:

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

Willst du mehr Kontrolle?

Verwenden Sie einfach eine vollständigere / spezifischere URL als Ersatz. Wenn beispielsweise GitHub-URLs nur https: // anstelle von git: // verwenden sollen, können Sie Folgendes verwenden:

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

Sie können diesen Befehl mehrmals mit verschiedenen Ersetzungen ausführen. Für den Fall, dass eine URL mit mehreren Ersetzungen übereinstimmt, "gewinnt" die längste Übereinstimmung. Pro URL wird nur ein einziger Ersatz vorgenommen.

Systemweite Änderungen für Sysadmins

Wenn Sie ein Linux-Systemadministrator sind und nicht möchten, dass Ihre Benutzer die oben genannten Probleme lösen müssen, können Sie eine schnelle systemweite Änderung der Git-Konfiguration vornehmen.

Bearbeiten oder fügen Sie einfach die folgenden Inhalte hinzu, /etc/gitconfigund Ihre Benutzer müssen sich über keine der oben genannten Punkte Gedanken machen:

[url "https://"]
    insteadOf = git://
Nathan S. Watson-Haigh
quelle
9
Geniale Einfachheit!
Lance Hunt
Funktioniert super! Kein Suchen und Ersetzen mehr. Build-Skripte funktionieren jetzt. Diese Antwort hat mir viel Zeit gespart. Vielen Dank!
Jeremy Bell
7
Um ein wenig mehr Kontrolle darüber zu haben, welche URL konvertiert wird, können Sie auch einen Teil der URL angeben. Beispiel: Ich habe einen privaten internen Server 'myserver.lan.example.com', der Git-Repos über SSH (gitlab) hostet, jedoch nicht über HTTPS. Deshalb habe ich muss SSH verwenden , wenn ich den Vorteil der bequemen Key - Authentifizierung zu nehmen. Ich verwende auch Repos von Github, aber meine Unternehmensfirewall blockiert SSH für Github. Ich möchte nicht einfach alle Instanzen von 'git: //' durch 'https: //' ersetzen, da dies gitlab beschädigen würde. Die Lösung ist git config --global url."https://github".insteadOf git://github.
Clayzermk1
2
Ich habe git innerhalb von Cygwin ausgeführt und die einzige Möglichkeit, dies zum Laufen zu bringen, bestand darin, die 'Systemweiten Änderungen für Sysadmins' vorzunehmen und die Änderungen 'url.https: //.insteadof=git: //' hinzuzufügen die Datei 'C: \ Programme (x86) \ Git \ etc \ gitconfig'. Danke für den Tipp!
Craig
3
Um diese Änderung rückgängig zu machen, kann mangit config --global --unset url."https://".insteadOf
djskinner
29

Github bietet auch http (s) -Zugriff, der von Ihrem Unternehmen mit viel geringerer Wahrscheinlichkeit blockiert wird. Um das Submodul anzuweisen, dies zu verwenden, können Sie Folgendes tun:

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

Dies ist genau der Grund, warum init und update separate Befehle sind - Sie können initiieren, Speicherorte anpassen und dann aktualisieren. update --initist nur eine Verknüpfung, wenn Sie keine URLs anpassen müssen.

Für alle anderen, die dies tun, können Sie natürlich auch eine ssh-URL verwenden (wenn Ihr Unternehmen git: // blockiert, aber nicht ssh), aber in diesem Fall hat das OP vermutlich keinen SSH-Zugriff auf das Remote-Repo.

Cascabel
quelle
Klingt so, als würde das wahrscheinlich für mich funktionieren, obwohl ich anscheinend jeden einzeln durchgehen muss. Hat github.com/ajaxorg/cloud9 speziell gemacht, wenn das wichtig ist.
Robert
4
@ Robert: Wenn es viele gibt, können Sie die Konfigurationsdatei direkt bearbeiten und suchen und ersetzen : sed -i 's@git://github@https://github@' .git/config.
Cascabel
Hmm, aus irgendeinem Grund sagen sie http: // in der Datei, aber der Befehl versucht immer noch git: //
Robert
1
Ich habe das gleiche Problem, das im OP beschrieben wurde, aber wenn ich diese Lösung verwende, schlägt sie immer noch fehl, jedoch mit einem etwas anderen Fehler. Es heißt "Fehler: beim Zugriff auf https: // ... fatal: HTTP-Anfrage fehlgeschlagen" Hat jemand einen Einblick in diese? Blockiert mein Host etwas? Meine anderen Submodule werden einwandfrei aktualisiert, ich habe nur Probleme mit einem.
Jo Sprague
13

Eine andere Option, bei der git config nicht berührt wird, besteht darin, die ssh-Einstellungen so zu ändern, dass Port 443 anstelle des regulären 22-Ports verwendet wird.

Referenz: Verwenden von SSH über den HTTPS-Port

Aus diesem Artikel:

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

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

Danach konnte ich erfolgreich Github pushen. Zu Hause können Sie die ssh-Konfiguration wieder so ändern, wie sie war, wenn Sie möchten.

elpddev
quelle
7

Ich hatte auch das gleiche Problem für eine Weile. Dann habe ich versucht, die Git-Konfiguration mit dem vorgeschlagenen Befehl zu ändern:

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

was mir leider nicht geholfen hat . Ich hatte immer noch das gleiche Problem!

Was mein Problem tatsächlich gelöst hat, ist, dass ich die Remote-URL meines Repositorys mit dem folgenden Befehl erneut zurückgesetzt habe:

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

das war vorher so:

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

Nach dem Einstellen der Remote-URL mit https://anstelle des [email protected]Problems wurde für mich behoben.

KM Rakibul Islam
quelle
1
Ich habe ein ähnliches Problem festgestellt. Es scheint, dass das Festlegen des globalen Bereichs nur die künftig geklonten Repos betrifft und sich nicht rückwirkend ändert.
Taylor Edmiston
2

Wenn Sie die obige Antwort von Nathan erweitern, können Sie auch das SSH-Protokoll ausprobieren, wenn Ihre Unternehmensfirewall https stört. In meinem Fall blockierte die Firewall das Git-Protokoll und stellte SSL-Zertifikate für https erneut aus. Dies brach mir die Laube, selbst wenn die Option strict-ssl deaktiviert war. Sie können eine ähnliche URL für ssh neu schreiben und einen ssh-Schlüssel / ein ssh-Paar erstellen, wie auf github beschrieben .

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

Sie müssten auch den ssh-agent für Ihre git-Installation aktivieren.

jhiller
quelle
1

Da sich die GIT-Adresse für den Knotenserver geändert hat, müssen Sie jetzt Folgendes eingeben:

Git-Klon https://github.com/joyent/node

Viel Glück

fmo
quelle
6
Diese Frage war ab Februar, als die oben genannte URL gültig war.
Robert
@calccrypto Der Link ist Teil eines Befehls, der nicht mit einem Code versehen ist. Er soll kein Link zu Informationen sein.
Mike Precup
0

Einführung

Ich werde hier meinen eigenen Ansatz hinzufügen ( der nicht erforderlich ist, wenn Sie ein öffentlich zugängliches Git-Repository haben, das https unterstützt ).

Ich arbeite in einer Firma, in der das Git-Repository nur von innerhalb der Firma zugänglich ist. Ich arbeite aber auch von zu Hause aus.

Wie kann ich von zu Hause aus in das Unternehmens-Repository pushen?

Ich habe ein Repository mit einem Ordner auf meinem Google-Laufwerk erstellt. Mit Ausnahme von git und https können Sie Repositorys als Pfade einfügen.

Geben Sie hier die Bildbeschreibung ein

Also, anstatt zum Ursprung zu drängen, drücke ich zu "gDrive". Dadurch wird der Ordner von meiner Heimarbeitsstation mit Google Drive synchronisiert, und mein Arbeitscomputer übernimmt die Änderungen. Da manchmal Dateien im Verzeichnis ".git" nicht synchronisiert werden, benenne ich den Ordner vorübergehend von z. B. "trunk" in "trunk2" um. Dadurch werden sowohl Heim- als auch Arbeitscomputer zu 100% mit Google Drive synchronisiert.

Ich melde mich dann entweder über checkpoint-vpn remote (oder teamviewer) bei meinem Arbeitscomputer an und übertrage meine Updates in das Work Git-Repository.

Darüber hinaus würde der Prozess umgekehrt funktionieren, um in ein Git-Repository außerhalb des blockierten Unternehmens zu pushen.

  1. Push von Workstation Git Repo in Ordner in Google Drive.
  2. Erzwingen Sie eine 100% ige Synchronisierung, indem Sie das Projektverzeichnis in gDrive vorübergehend umbenennen.
  3. Greifen Sie über eine Fernbedienung auf den Heimcomputer zu und drücken Sie Änderungen.
Menios
quelle