Використання проксі-сервера шкарпеток з git для http-транспорту


81

Як змусити git використовувати проксі-сервер socks для транспортування HTTP?

Мені вдалося налаштувати git за допомогою GIT_PROXY_COMMAND, щоб використовувати проксі-сервер socks для транспортування GIT.

Крім того, я налаштував свій файл .curlrc на визначення проксі-сервера socks, і я можу отримувати інформацію безпосередньо за допомогою команди curl, наприклад:

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

Але як використовувати проксі-сервер socks з git для отримання даних за допомогою транспортного протоколу HTTP, наприклад:

git clone http://git.kernel.org/pub/scm/git

Відповідь patthoyts Це нижче буде офіційно підтримуватися в мерзотника 2.7 (схиляння 2015): stackoverflow.com/a/34118102/6309
VonC

Відповіді:


149

Я тестував з проксі-сервером Git 1.8.2 і SOCKS v5, для мене працюють такі налаштування:

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

ОНОВЛЕННЯ 2017-3-31:

Згідно з документом , незважаючи на назву , він повинен працювати як для HTTP, так і для URL-адрес сховища HTTPS. Дякую @user за те, що вказав на це.http.proxy

ОНОВЛЕННЯ 2018-11-27:

Щоб вимкнути проксі, запустіть команду:

git config --global --unset http.proxy

РЕДАГУВАТИ 2019-03-04:

Якщо ви також хочете, щоб ім'я хосту було вирішено за допомогою проксі-сервера, використовуйте рішення thuzhf нижче, яке використовує socks5hзамістьsocks5


3
brantyoung, Дякую! Я забув заплатити з’єднання з Інтернетом і не мав зовнішнього зв’язку. Я використовував інший сервер як шлюз із: ssh -D 4000 <user> @server -p <port>, і мені вдалося завантажити проект у github over: git config http.proxy 'socks5: // localhost: 4000'. Дякую.

Я отримаю гроші і заплачу за Інтернет :), тому що проект майже готовий :)

1
Як зняти налаштування? я встановлюю на ''?
briankip 02

2
@briankip відкривати ~/.gitconfigта видаляти [https.proxy]та [http.proxy]розділи, це iniфайл, сміливо редагуйте його.
Ян. Y 02

3
@briankip, я думаю, ви можете просто помістити його в командний рядок, а не постійно у своєму конфігурі, наприклад git -c http.proxy=socks5://127.0.0.1:7070, або щось подібне. Можливо, ви могли б створити для цього псевдонім gitsocks, який дозволив би вам легко викликати git із шкарпетками та без них за бажанням`
Aaron McDaid

52

Якщо ви не хочете встановлювати проксі як глобальну конфігурацію, спробуйте, ALL_PROXY=наприклад:

$ ALL_PROXY=socks5://127.0.0.1:8888 git clone https://github.com/some/one.git

1
Дякую! це дійсно мені допомагає, тоді як глобальний ні.
redreamality

1
Дякую! ДІЙСНО ПРАЦЮЄ!
smoothdvd

44

(Тільки невелике нагадування) Якщо ви хочете, щоб ім'я хосту також було вирішено проксі-сервером (це означає передавати все через проксі-сервер ), особливо коли ви клонуєте суть , ви можете використовувати наступне налаштування (головне, що воно використовує socks5h замість цього з socks5 ):

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

15

Я використовую наступну команду для клонування певного сховища із проксі socks5. Параметри проксі-сервера вказані з --configопцією.

$ git clone https://github.com/xxxxx --config 'http.proxy=socks5://127.0.0.1:1234'

Це єдине рішення для мене, комбіноване з 'ssh -D xxx'
Tiana987642,

7

Примітка: патч тут був застосований до git у 2015 році для версії 2.4.11. З цього часу ви можете просто використовувати URL-адреси socks: // з налаштуваннями конфігурації http.proxy.

Для протоколу git: // ми використовуємо Git із проксі-сервером SOCKS . Однак, схоже, git не підтримує належним чином проксі-сервери socks. Сам git пов'язаний з libcurl. Отже, файл .curlrc не використовується (тобто саме для клієнта командного рядка curl). Однак наступний патч забезпечує необхідну підтримку. За допомогою цього патча, застосованого до git, ми можемо просто встановити для змінної середовища ALL_PROXY або HTTP_PROXY або HTTPS_PROXY значення socks://hostname:portnum(або socks4 / socks5), або ж налаштування http.proxy git і libcurl фактично використовуватимуть протокол socks при використанні проксі-сервера.

Наприклад, активний трасування:

$ 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 ...

Необхідний патч:

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;

Як я вже писав, мені вдалося налаштувати git для використання проксі-сервера socks для транспорту GIT. Що я хочу, це використовувати git з проксі-сервером для шкарпеток для транспорту HTTP (S)
Ів Блуссо

3

Щодо посилання на @briankip та видалення налаштування проксі http, як згадував Yang.Y, ви можете безпосередньо редагувати файл ini.

Ви також можете зробити це в командному рядку за допомогою

git config --global --unset http.proxy

Для підтвердження його видалення перелічіть поточну конфігурацію за допомогою

git config --list


1

Жоден із запропонованих методів не спрацював для мене, тому я знайшов інший підхід як наступну інструкцію:


  1. Зробіть тунель (динамічне пересилання портів) за SOCKS5протоколом, використовуючи ssh:
    ssh -ND 9994 user@YourSshServer

  1. Встановіть proxychainsна вашому localhost, а не на сервері ssh, до якого ви підключені:

  1. Відредагуйте proxychainsфайл налаштування:
    sudo nano /etc/proxychains.confпотім додайте наступний рядок у кінці файлу:
    socks5 127.0.0.1 9994

  1. Тепер ми готові виконати gitкоманду (її proxychainsпотрібно розмістити перед командою):
    proxychains git push origin develop

0

Жодне з перерахованого не працювало для мене, на жаль, однак:

nano ~/.ssh/config

Додати:

Host my-host.foo.bar.com
    ProxyJump username@host.local

Де 'host.local' - це ванільний Mac з включеним віддаленим входом у налаштуваннях спільного доступу. Працював у мене :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.