Verwenden eines Socken-Proxys mit Git für den http-Transport

81

Wie kann Git einen Socken-Proxy für den HTTP-Transport verwenden?

Es gelingt mir, git mit GIT_PROXY_COMMAND so zu konfigurieren, dass ein Socken-Proxy für den GIT-Transport verwendet wird.

Außerdem habe ich meine .curlrc-Datei so konfiguriert, dass sie den Socken-Proxy definiert, und ich kann Informationen direkt mit dem Befehl curl abrufen, z.

curl http://git.kernel.org/pub/scm/git/git.git/info/refs?service=git-upload-pack

Aber wie man einen Socken-Proxy mit Git verwendet, um Daten mit dem HTTP-Transportprotokoll abzurufen, wie:

git clone http://git.kernel.org/pub/scm/git
Yves Blusseau
quelle
Die Antwort von patthoyts unten wird offiziell in git 2.7 (Dez. 2015) unterstützt: stackoverflow.com/a/34118102/6309
VonC
stackoverflow.com/questions/10274879/…
Ciro Santilli 13 冠状 冠状 病 六四 法轮功

Antworten:

148

Ich habe mit Git 1.8.2 und SOCKS v5 Proxy getestet. Die folgende Einstellung funktioniert für mich:

git config --global http.proxy 'socks5://127.0.0.1:7070'

UPDATE 2017-3-31:

Laut dem Dokument trotz des Namenshttp.proxy sowohl für HTTP- als auch für HTTPS-Repository-URLs funktionieren. Vielen Dank an @user für den Hinweis.

UPDATE 2018-11-27:

Führen Sie den folgenden Befehl aus, um den Proxy zu deaktivieren:

git config --global --unset http.proxy

EDIT 2019-03-04:

Wenn Sie auch möchten, dass der Hostname mithilfe des Proxys aufgelöst wird, verwenden Sie die folgende Lösung von thuzhf, die socks5hanstelle von verwendet wirdsocks5

Yang.Y
quelle
3
brantyoung, danke! Ich habe vergessen, die Internetverbindung zu bezahlen und hatte keine externe Verbindung. Ich habe einen anderen Server als Gateway verwendet mit: ssh -D 4000 <Benutzer> @server -p <Port> und habe erfolgreich ein Projekt auf github hochgeladen: git config http.proxy 'socks5: // localhost: 4000'. Dankeschön.
Ich werde Geld bekommen und für das Internet bezahlen :), weil das Projekt fast fertig ist :)
1
Wie deaktiviere ich? setze ich auf ''?
Briankip
2
@briankip öffnen ~/.gitconfigund entfernen [https.proxy]und [http.proxy]Abschnitte, es ist eine iniDatei, können Sie sie bearbeiten.
Yang.Y
3
@briankip, ich denke, Sie können es einfach in die Befehlszeile einfügen, anstatt permanent in Ihrer Konfiguration, z. B. git -c http.proxy=socks5://127.0.0.1:7070oder so ähnlich. Vielleicht könnten Sie einen Alias gitsocksdafür erstellen, der es Ihnen ermöglicht, Git mit und ohne Socken wie gewünscht anzurufen "
Aaron McDaid
50

Wenn Sie den Proxy nicht als globale Konfiguration festlegen möchten, versuchen Sie ALL_PROXY=Folgendes:

$ ALL_PROXY=socks5://127.0.0.1:8888 git clone https://github.com/some/one.git
Oh ho
quelle
1
Vielen Dank! Das hilft mir wirklich, während das globale nicht hilft.
Redreamality
1
Vielen Dank! FUNKTIONIERT WIRKLICH!
Smoothdvd
44

(Nur eine kleine Erinnerung) Wenn Sie möchten, dass der Hostname auch vom Proxy aufgelöst wird ( dh , dass alles durch den Proxy geleitet wird ), insbesondere wenn Sie einen Kern klonen , können Sie die folgende Einstellung verwenden (der Schlüssel ist, dass stattdessen socks5h verwendet wird von Socken5 ):

git config --global http.proxy socks5h://127.0.0.1:1080
thuzhf
quelle
15

Ich verwende den folgenden Befehl, um ein bestimmtes Repository vom socks5-Proxy zu klonen. Die Proxy-Einstellungen werden mit --configOption angegeben.

$ git clone https://github.com/xxxxx --config 'http.proxy=socks5://127.0.0.1:1234'
Alijandro
quelle
Dies ist die einzige Lösung für mich,
kombiniert
7

Hinweis: Der Patch hier wurde 2015 für Version 2.4.11 auf Git angewendet. Seitdem können Sie einfach socks: // urls mit den Konfigurationseinstellungen von http.proxy verwenden.

Für das git: // Protokoll haben wir Using Git mit einem SOCKS-Proxy . Es scheint jedoch, dass Git Socken-Proxys nicht richtig unterstützt. Git selbst ist mit libcurl verknüpft. Daher wird die .curlrc-Datei nicht verwendet (dies gilt nur für den Curl-Befehlszeilenclient). Der folgende Patch bietet jedoch die erforderliche Unterstützung. Mit diesem Patch, der auf git angewendet wird, können wir einfach die Umgebungsvariable ALL_PROXY oder HTTP_PROXY oder HTTPS_PROXY auf socks://hostname:portnum(oder socks4 / socks5) setzen, oder die Konfigurationseinstellung http.proxy git und libcurl verwenden jetzt tatsächlich das socks-Protokoll, wenn der Proxy verwendet wird.

Zum Beispiel eine aktive Ablaufverfolgung:

$ GIT_CURL_VERBOSE=1 bin-wrappers/git -c "http.proxy=socks://localhost:1080" ls-remote http://github.com/patthoyts/tclftd2xx.git
* Couldn't find host github.com in the _netrc file; using defaults
* About to connect() to proxy localhost port 1080 (#0)
*   Trying 127.0.0.1...
* connected
* SOCKS4 request granted.
* Connected to localhost (127.0.0.1) port 1080 (#0)
> GET /patthoyts/tclftd2xx.git/info/refs?service=git-upload-pack HTTP/1.1
User-Agent: git/1.8.1.msysgit.1.dirty
... and on to a successful request ...

Der notwendige Patch:

diff --git a/http.c b/http.c
index 3b312a8..f34cc75 100644
--- a/http.c
+++ b/http.c
@@ -322,6 +322,14 @@ static CURL *get_curl_handle(void)
        if (curl_http_proxy) {
                curl_easy_setopt(result, CURLOPT_PROXY, curl_http_proxy);
                curl_easy_setopt(result, CURLOPT_PROXYAUTH, CURLAUTH_ANY);
+#if LIBCURL_VERSION_NUM >= 0x071800
+               if (!strncmp("socks5", curl_http_proxy, 6))
+                       curl_easy_setopt(result, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
+               else if (!strncmp("socks4a", curl_http_proxy, 7))
+                       curl_easy_setopt(result, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4A);
+               else if (!strncmp("socks", curl_http_proxy, 5))
+                       curl_easy_setopt(result, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);
+#endif
        }

        return result;
Patthoyts
quelle
Wie ich geschrieben habe, ist es mir gelungen, git so zu konfigurieren, dass Socken-Proxy für den GIT-Transport verwendet wird. Was ich will, ist Git mit einem Socken-Proxy für den HTTP (S)
-Transport zu
3

Nur in Bezug auf @briankip und Entfernen der http-Proxy-Einstellung, wie Yang.Y erwähnt hat, können Sie die INI-Datei direkt bearbeiten.

Sie können dies auch in der Befehlszeile mit tun

git config --global --unset http.proxy

Um zu bestätigen, dass es entfernt wurde, listen Sie die aktuelle Konfiguration mit auf

git config --list

Paul H.
quelle
1

Keine der vorgeschlagenen Methoden funktionierte für mich, daher fand ich einen anderen Ansatz als die folgende Anweisung:


  1. Erstellen Sie einen Tunnel (dynamische Portweiterleitung) über das SOCKS5Protokoll mit ssh:
    ssh -ND 9994 user@YourSshServer

  1. Installieren Sie proxychainsauf Ihrem lokalen Host, nicht auf dem SSH-Server, mit dem Sie verbunden sind:

  1. Bearbeiten Sie Ihre proxychainsKonfigurationsdatei: Fügen Sie
    sudo nano /etc/proxychains.confam Ende der Datei die folgende Zeile hinzu:
    socks5 127.0.0.1 9994

  1. Jetzt können wir einen gitBefehl ausführen ( proxychainsmuss vor dem Befehl stehen):
    proxychains git push origin develop
Benyamin Jafari
quelle