#go #git #windows #ssh Часть I. Так получилось, что на работе мы используем Windows. Мне для одного проекта потребовалось использовать пакеты из приватных репозиториев. И из шкафа посыпались скелеты.
☝️ Современный GO умеет работать с Git, Subversion, Mercurial, Bazaar, и Fossil [1], но я рассматриваю только Git.
👉 Отмечу одну важную деталь:
🍏 Первый способ заключается в сохранении логина и пароля через настройку конфигурации [3]:
или
Продолжение дальше...
[1] https://go.dev/ref/mod
[2] https://proxy.golang.org/
[3] https://git-scm.com/docs/gitcredentials
[4] https://git-scm.com/docs/git-config#Documentation/git-config.txt-urlltbasegtinsteadOf
☝️ Современный GO умеет работать с Git, Subversion, Mercurial, Bazaar, и Fossil [1], но я рассматриваю только Git.
👉 Отмечу одну важную деталь:
go mod ...
и go get ...
«ходят» не напрямую в ваш репозиторий, а через прокси, контролируемый значением переменной GOPROXY. Посмотрите, что говорит go env
[2]. GO не просто пользуется прокси, а сверяет с базой контрольных сумм из переменной GOSUMDB. Переменные GONOPROXY и GONOSUMDB указывают, для каких путей импорта не будет использоваться прокси и/или база сумм. Переменная GOPRIVATE перечисляет пути импорта, для которых не будут использоваться ни прокси, ни суммы. Работу с приватными репозиториями следует начинать с настройки GOPRIVATE, ключ -w
запишет переменную:go env -w GOPRIVATE="git.mysecret.com/myrepo,git.supersecret.com"
🌧 Подвох кроется в том, что GO подавляет ввод пароля при работе с git. Что-то с этим придется делать. 🍏 Первый способ заключается в сохранении логина и пароля через настройку конфигурации [3]:
git config credential.helper store
или
git config credential.helper cache
Затем надо «поработать» с нужными приватным репозиториями напрямую командами git, чтобы он запросил, а затем запомнил логин/пароль: git clone
или git pull
или git push
В случае store git запомнит логин/пароль в файл, в случае cache — временно в память. Строго говоря, там довольно гибкая система этих credentials, можете почитать для себя. Это работает для доступа по https (умолчание). Можно сразу задать пользователя:git config credential.https://example.com.username myusername
Ещё один способ — указать git переписывать URL [4]: git config --global url."https://api:$[email protected]/".insteadOf "https://github.com/"
🍐 Но что, если требуется использовать SSH (например, используется gitolite) и соответственно с ключами SSH? ...Продолжение дальше...
[1] https://go.dev/ref/mod
[2] https://proxy.golang.org/
[3] https://git-scm.com/docs/gitcredentials
[4] https://git-scm.com/docs/git-config#Documentation/git-config.txt-urlltbasegtinsteadOf
#go #git #windows #ssh Часть II. Так получилось, что на работе мы используем Windows. Мне для одного проекта потребовалось использовать пакеты из приватных репозиториев. И из шкафа посыпались скелеты.
... продолжение
🍐 Но что, если требуется использовать SSH (например, используется gitolite) и соотвественно с ключами SSH? Используем перенаправление:
Это заставит git использовать протокол SSH для выбранного URL.
🌶 Если ключ SSH можно хранить прямо на машине, то всё относительно просто. А вот если на ключе SSH должен стоять пароль, то начинаются вопросы. Нам требуется ssh-agent
✅ На современных Windows 10 и 11 прямо в поставке идёт Windows-порт OpenSSH [5], его из коробки видит Git для Windows. Всё будет работать само. Кроме ssh-agent. После выполнения в PowerShell этих простых команд, в Windows появится сервис ssh-agent, который будет запускаться автоматически при перезагрузке компьютера [6][7]:
❌ В Windows OpenSSH ssh-agent запоминает добавленные ключи в реестр Windows, откуда считывает их при перезагрузке.Эти ключи может использовать только тот пользователь, который их добавил. Но если у пользователя Windows нет пароля, то ключ оказывается доступен для всех [9], и придется каждый раз удалять его через
☝️ Стандартная поставка Git для Windows включает команды
🏆 В современном Windows есть подсистема WSL2 (Windows Subsystem for Linux), и можно пользоваться ею. Ставим Windows Terminal (предупреждаю, без него без слез невозможно работать в Linux-консоли), инициализируем WSL2 [10] и просто работаем. Там и агент сразу запустится. С WSL2 умеют работать и vim, и VSCode [11] и GoLand [12]. Смотрите, для VSCode достаточно набрать
🛠 Важно! И PowerShell, и WSL2, и OpenSSH — это часть поставки Windows. Они просто есть. Windows Terminal является родной программой Microsoft, но в Windows 10 его придется через «Приложения Microsoft», а в Windows 11 он идет в поставке системы.
[5] https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse
[6] https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement
[7] https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-service
[8] https://github.com/PowerShell/Win32-OpenSSH/issues/1136
[9] https://github.com/PowerShell/Win32-OpenSSH/issues/1487
[10] https://docs.microsoft.com/en-us/windows/wsl/install
[11] https://code.visualstudio.com/docs/remote/wsl
[12] https://www.jetbrains.com/help/go/2022.1/how-to-use-wsl-development-environment-in-product.html
... продолжение
🍐 Но что, если требуется использовать SSH (например, используется gitolite) и соотвественно с ключами SSH? Используем перенаправление:
git config --global url."ssh://git@examples.com/".insteadOf "https://examples.com/"
Это заставит git использовать протокол SSH для выбранного URL.
🌶 Если ключ SSH можно хранить прямо на машине, то всё относительно просто. А вот если на ключе SSH должен стоять пароль, то начинаются вопросы. Нам требуется ssh-agent
✅ На современных Windows 10 и 11 прямо в поставке идёт Windows-порт OpenSSH [5], его из коробки видит Git для Windows. Всё будет работать само. Кроме ssh-agent. После выполнения в PowerShell этих простых команд, в Windows появится сервис ssh-agent, который будет запускаться автоматически при перезагрузке компьютера [6][7]:
Get-Service -Name sshd | Set-Service -StartupType AutomaticКомандой
Start-Service sshd
ssh-add
можно добавить ключи в агента. Никаких переменных окружения не надо настраивать. Современный агент работает через именованный канал (named pipe) [8]. Переменная SSH_AUTH_SOCK не используется ssh-agent в Windows.❌ В Windows OpenSSH ssh-agent запоминает добавленные ключи в реестр Windows, откуда считывает их при перезагрузке.Эти ключи может использовать только тот пользователь, который их добавил. Но если у пользователя Windows нет пароля, то ключ оказывается доступен для всех [9], и придется каждый раз удалять его через
ssh-agent -d
или ssh-agent -D
☣️ Этим недостатком не обладает старый добрый PuTTY. Можно настроить его.☝️ Стандартная поставка Git для Windows включает команды
start-ssh-agent.cmd
и start-putty-agent.cmd
. Представляют исторический интерес.🏆 В современном Windows есть подсистема WSL2 (Windows Subsystem for Linux), и можно пользоваться ею. Ставим Windows Terminal (предупреждаю, без него без слез невозможно работать в Linux-консоли), инициализируем WSL2 [10] и просто работаем. Там и агент сразу запустится. С WSL2 умеют работать и vim, и VSCode [11] и GoLand [12]. Смотрите, для VSCode достаточно набрать
code .
внутри вашего воркспейса в WSL!🛠 Важно! И PowerShell, и WSL2, и OpenSSH — это часть поставки Windows. Они просто есть. Windows Terminal является родной программой Microsoft, но в Windows 10 его придется через «Приложения Microsoft», а в Windows 11 он идет в поставке системы.
[5] https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse
[6] https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement
[7] https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-service
[8] https://github.com/PowerShell/Win32-OpenSSH/issues/1136
[9] https://github.com/PowerShell/Win32-OpenSSH/issues/1487
[10] https://docs.microsoft.com/en-us/windows/wsl/install
[11] https://code.visualstudio.com/docs/remote/wsl
[12] https://www.jetbrains.com/help/go/2022.1/how-to-use-wsl-development-environment-in-product.html