Avatar ·

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

Привет всем! Я новичок в Go и пытаюсь подключить приватный репозиторий GitHub в своем проекте. У меня есть файл go.mod с зависимостью: ``` require github.com/mycompany/private-repo v0.1.0 ``` Когда я запускаю `go get github.com/mycompany/private-repo@latest`, я получаю ошибку: ``` go get github.com/mycompany/private-repo@latest: github.com/mycompany/private-repo@v0.1.0: terminal prompts disabled Use the 'gitconfig' or 'GIT_TERMINAL_PROMPT' environment variable to enable prompts ``` Я уже добавил SSH-ключ в свой GitHub-аккаунт и могу клонировать репозиторий через `git clone git@github.com:mycompany/private-repo.git` без проблем. Но Go почему-то не хочет работать. Пробовал менять GOPROXY на `direct` — не помогло. Использую Go 1.21 на macOS. Подскажите, что делать? Проект корпоративный, доступ только по SSH. <<>>

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

Ошибка возникает из-за того, что Go по умолчанию использует HTTPS для доступа к репозиториям GitHub, а приватные репозитории требуют аутентификации. SSH-ключи работают только при использовании SSH-протокола, который Go не использует автоматически. В результате Go пытается запросить логин/пароль интерактивно, но при автоматической сборке (например, в CI/CD) терминальные запросы отключены.

Решение: настройка Git для использования SSH

Нужно заставить Go использовать SSH вместо HTTPS для домена github.com. Это делается через конфигурацию Git:

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

После этого Go будет автоматически заменять HTTPS-URL на SSH при загрузке модулей. Проверьте результат:

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

Теперь попробуйте снова:

go clean -modcache
go get github.com/mycompany/private-repo@latest

Альтернативное решение: настройка GOPRIVATE

Чтобы Go не пытался обращаться к прокси-серверам для приватных репозиториев, добавьте их в переменную GOPRIVATE:

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

Или для всех приватных репозиториев компании:

go env -w GOPRIVATE=github.com/mycompany/*,gitlab.com/mycompany/*

Это отключит использование GOPROXY и проверку контрольных сумм для указанных модулей.

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

Вот минимальная последовательность действий для успешной загрузки приватного модуля:

  1. Убедитесь, что SSH-ключ добавлен в ssh-agent: ssh-add -l
  2. Настройте Git на замену протокола: git config --global url."git@github.com:".insteadOf "https://github.com/"
  3. Укажите приватные модули: go env -w GOPRIVATE=github.com/mycompany/*
  4. Очистите кеш: go clean -modcache
  5. Выполните загрузку: go get github.com/mycompany/private-repo@latest

Дополнительные рекомендации

  • Для CI/CD: используйте Personal Access Token (PAT) с доступом к репозиториям. Настройте Git: git config --global url."https://USERNAME:PAT@github.com/".insteadOf "https://github.com/"
  • Проверка подключения: ssh -T git@github.com должно вывести сообщение об успешной аутентификации
  • Отладка: включите подробный вывод: GIT_TERMINAL_PROMPT=1 go get -v github.com/mycompany/private-repo@latest

После настройки все команды go get, go mod download и go build будут работать с приватными репозиториями автоматически.

<<>>

Использование .netrc для аутентификации через HTTPS

Если по каким-то причинам SSH не подходит (например, ограничения корпоративной сети), можно настроить аутентификацию через HTTPS с помощью файла .netrc:

  1. Создайте Personal Access Token (PAT) на GitHub с правами repo.
  2. Добавьте запись в ~/.netrc:
machine github.com
login YOUR_GITHUB_USERNAME
password YOUR_PAT_TOKEN

Убедитесь, что права доступа к файлу ограничены:

chmod 600 ~/.netrc

Теперь Go будет использовать эти данные для аутентификации при HTTPS-запросах. Этот метод удобен, если у вас уже настроены HTTPS-URL в go.mod и вы не хотите менять конфигурацию Git.

Важно: Не храните .netrc в публичных репозиториях! Для CI/CD лучше использовать переменные окружения.