Avatar ·

Ошибка "terminal prompts disabled" при go get для приватного репозитория GitHub

Привет! Я новичок в Go и пытаюсь подключить приватный репозиторий GitHub в свой проект. Настроил SSH-ключи, добавил их в агент, проверил — `git clone git@github.com:myorg/myrepo.git` работает отлично без запроса пароля. Но когда я делаю `go get github.com/myorg/myrepo`, получаю ошибку: ``` go: github.com/myorg/myrepo@v0.0.0-xxxx: terminal prompts disabled Use the 'git config core.askPass' or 'GIT_ASKPASS' environment variable, or set 'SSH_AUTH_SOCK' ``` У меня в `go.mod` прописано `module myproject`, и я добавил `require github.com/myorg/myrepo v0.0.0`. Go версия 1.16, на Windows 10. Пробовал запускать с `GIT_TERMINAL_PROMPT=1` — не помогло. В `.gitconfig` у меня есть настройка `[url "git@github.com:"]` с `insteadOf = https://github.com/`. Но всё равно не работает. Как правильно настроить Go, чтобы он мог скачивать приватные репозитории? Может, нужно что-то ещё в переменных окружения прописать? <<>>

Причина ошибки

Go по умолчанию отключает интерактивные запросы пароля (терминальные промпты) при работе с git через HTTPS. Даже если вы настроили SSH, Go может пытаться использовать HTTPS из-за того, как настроен git или GOPROXY. Ошибка возникает, когда git пытается запросить логин/пароль в терминале, но Go блокирует этот запрос.

Решение: принудительное использование SSH

Самый надёжный способ — заставить Go всегда использовать SSH для GitHub, изменив глобальную конфигурацию git:

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

Эта команда заменяет все HTTPS-ссылки на SSH. Проверьте, что команда сработала:

git config --global --get url."git@github.com:".insteadOf
# Должно вывести: https://github.com/

Дополнительная настройка для Windows

На Windows убедитесь, что SSH-агент работает и содержит ваш ключ:

# Запуск агента (если не запущен)
Start-Service ssh-agent

# Добавление ключа
ssh-add C:\Users\ВашеИмя\.ssh\id_rsa

# Проверка
ssh -T git@github.com
# Должно вывести: Hi username! You've successfully authenticated...

Исправление GOPROXY

Если вы используете прокси (например, GoCenter или JFrog), он может пытаться закешировать приватный модуль. Отключите прокси для приватных репозиториев:

go env -w GOPRIVATE=github.com/myorg/*

Также можно указать переменную окружения:

export GOPRIVATE=github.com/myorg/*  # Linux/macOS
set GOPRIVATE=github.com/myorg/*     # Windows CMD
$env:GOPRIVATE="github.com/myorg/*"  # PowerShell

Полный рабочий пример

# 1. Настройка SSH (один раз)
git config --global url."git@github.com:".insteadOf "https://github.com/"

# 2. Исключение приватных модулей из прокси
go env -w GOPRIVATE=github.com/myorg/*

# 3. Очистка кеша (если ранее были ошибки)
go clean -modcache

# 4. Повторный запуск
go get github.com/myorg/myrepo@latest

Если всё ещё не работает

  • Проверьте, что репозиторий существует и у вас есть к нему доступ
  • Убедитесь, что версия модуля указана корректно (можно использовать @latest)
  • Попробуйте GIT_TERMINAL_PROMPT=1 go get ... — если запросит пароль, значит проблема именно в SSH
  • На Windows может потребоваться перезапустить терминал после изменений переменных окружения
<<>>

Альтернативный подход: использование .netrc или GIT_ASKPASS

Если по каким-то причинам вы не можете или не хотите использовать SSH, можно настроить автоматическую аутентификацию через HTTPS с помощью файла _netrc (на Windows) или .netrc (на Linux/macOS).

Создайте файл ~/_netrc (Windows) или ~/.netrc (Linux/macOS) с содержимым:

machine github.com
login ваш_логин
password ваш_персональный_токен_доступа

Персональный токен доступа (PAT) нужно создать на GitHub: Settings → Developer settings → Personal access tokens → Generate new token. Дайте ему права repo (для приватных репозиториев).

Затем установите переменную окружения:

export GIT_ASKPASS=true  # Linux/macOS
set GIT_ASKPASS=true     # Windows CMD

Или используйте git config --global core.askPass /путь/к/скрипту, который будет возвращать пароль. Однако проще всего — настроить SSH, как описано в первом ответе: это более безопасно и не требует хранения токена в открытом виде.