В сети есть обсуждение такого нерешенного вопроса:
Работа Git (например с GitHub) через SOCKS5 Proxy в условиях отсутствия DNS
Кратко, проблема вот в чем:
Нахожусь в корпоративной сети. Имею доступ как пользователь к линуховому серверу, у которого есть выход в интернет. Захожу на этот сервер по SSH через Putty.
На рабочем месте Windows 7. Для серфинга включаю Putty, которая делает туннель и поднимает локально на машине порт SOCKS5 Proxy. Запускаю FireFox, у которого настроено использование SOCKS5 Proxy, и стоит галочка «Удаленный DNS» (в других браузерах, кстати, такой настройки не предусмотрено, поэтому они не подходят). И интернет в FireFox работает.
Теперь мне нужно начать работать с git. В git есть глобальные настройки:
> git config --list
http.proxy='socks5://127.0.0.1:9999'
https.proxy='socks5://127.0.0.1:9999'
socks.proxy=127.0.0.1:9999
socks5.proxy=127.0.0.1:9999
Однако при попытке запушить изменения, получаю ошибку:
> git push
ssh: github.com: no address associated with name
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
Похоже, что ошибка эта из-за того, что git не умеет резолвить DNS-имена через SOCKS5 Proxy, а просто пользуется тем что есть в системе. А может быть, нужна какая-то дополнительная настройка.
В ответ на этот вопрос было предложено решение: прописать IP адрес github.com в файл windows\system32\drivers\etc\hosts. Проблема в том, что это решение не помогает, потому что вопрос оказался куда сложнее.
Перед дальнейшим обсуждением, подведу краткий итог. Для организации доступа Git в Интернет надо:
1. Иметь запущенным Putty с проброшенным SOCKS5 туннелем (опция -D):
putty.exe -load funnyLinuxHost -D 9999 10.159.168.48
2. В конфиге Git (в каталоге пользователя есть файл .gitconfig) иметь, как минимум, опцию:
[http]
proxy = socks5://127.0.0.1:9999
3. В файле hosts иметь интернетовый IP-адрес для доменного имени github.com
А что нужно еще, написано дальше.
Долгие попытки настройки показали, что обращение к socks-прокси возможно только при использовании http/https протокола. Git не работает через socks5-прокси, если адрес репозитария прописан по протоколу git, например git@github.com:xintrea/monitoring-sp.git. Обнаружить эту особенность в документации мне не удалось (может быть плохо читал), но по факту это так.
Если поменять в настройках репозитария адрес сервера на протокол https (например на https://github.com/xintrea/monitoring-sp.git), то Git начинает соединяться с github. (Настройки репозитария проще всего поменять в файле ./git/config, опция url). Казалось бы, проблема решена. Но нет, тут вступает в дело политика самого GitHub.com.
Дело в том, что соединение на внесение изменений в репозитарий (например git push) на сервисе GitHub.com допустимо как про протоколу git, так и по протоколу https. Но есть нюанс: по протоколу git возможна авторизация по SSH ключу, а по протоколу https такая авторизация почему-то запрещена, даже если все ключи установлены. Поэтому при использовании репозитария по протоколу https, Git будет всегда запрашивать логин и пароль.
Теперь возникает вопрос: как комфортно работать с удаленным репозитарием по протоколу https, чтобы все время не вводить логин-пароль на каждую операцию. Оказывается, этот вопрос не так уж и прост. Например, можно попытаться воспользоваться кешированием пароля:
Caching your GitHub password in Git
Но и тут проблема: кеширование пароля (в среде Windows) работает только в нативном Git-шелле Git for Windows. А если пользоваться обычным cmd, то в нем такой возможности нет. Опять же об удобстве использования в нативном окружении Windows не может быть и речи.
Таким образом, для решения данного вопроса придется идти на крайние меры: прописать логин и пароль прямо в https-линк репозитария. Вот так:
[remote "origin"]
url = https://пользователь:пароль@github.com/xintrea/monitoring-sp.git
Да, это не секьюрно, но другого варианта нормальной работы через socks5-proxy в Windows просто нет.