Go get приватного репозитория: почему это боль для новичков?
Вы написали крутой Go-пакет, залили его на GitHub в приватный репозиторий, и теперь хотите использовать его в другом проекте. Выполняете go get github.com/yourname/secret-lib — и получаете ошибку 403 Forbidden или remote: Repository not found. Знакомо?
Эта ситуация — одна из самых частых ловушек для начинающих Go-разработчиков. Вопрос на Stack Overflow «What's the proper way to "go get" a private repository?» набрал тысячи просмотров. Проблема в том, что go get по умолчанию использует HTTPS, а не SSH, и не знает ваших учётных данных.
В этой статье мы разберём три рабочих способа настроить go get для приватных репозиториев: через .gitconfig, .netrc и переменную окружения GOPRIVATE. Вы узнаете, как избежать ошибок и сэкономить часы дебага.
Почему go get не работает с приватными репозиториями?
По умолчанию go get пытается скачать модуль через HTTPS. Для публичных репозиториев это окей — анонимный доступ работает. Но приватные репозитории требуют аутентификации. Go не умеет сам подставлять логин/пароль или токен.
Вторая проблема — механизм обнаружения модулей. Go сначала проверяет, есть ли репозиторий на GitHub/GitLab/Bitbucket, анализируя HTML-страницу. Для приватных репозиториев эта страница недоступна без авторизации. Отсюда и ошибка repository not found, хотя репозиторий существует.
Способ 1: правим ~/.gitconfig (самый простой)
Самый лёгкий путь — заставить Git использовать SSH вместо HTTPS для конкретного домена. Добавьте в файл ~/.gitconfig следующие строки:
[url "git@github.com:"]
insteadOf = https://github.com/
Теперь любой запрос к https://github.com/ будет автоматически заменён на SSH. Убедитесь, что у вас настроен SSH-ключ и добавлен в аккаунт GitHub/GitLab.
Проверяем:
go get github.com/your-org/private-repo
# Работает без ошибок!
Важно: этот способ меняет поведение для всех репозиториев на GitHub. Если вам нужно только для одного, используйте более точную настройку:
[url "git@github.com:your-org/"]
insteadOf = https://github.com/your-org/
Способ 2: .netrc для токенов и паролей
Если вы предпочитаете HTTPS (например, в CI/CD), используйте файл ~/.netrc. Go умеет читать этот файл и подставлять учётные данные.
Создайте файл ~/.netrc с правами 600:
machine github.com
login your-github-username
password your-personal-access-token
Где взять токен? На GitHub: Settings → Developer settings → Personal access tokens → Generate new token. Выберите права repo (для приватных репозиториев).
После этого:
go get github.com/your-org/private-repo
Для GitLab:
machine gitlab.com
login your-gitlab-username
password your-gitlab-access-token
Этот способ идеален для CI/CD, где SSH-ключи не всегда удобно хранить.
Способ 3: GOPRIVATE — спасательный круг для модулей
Переменная окружения GOPRIVATE говорит Go: «Эй, эти модули приватные, не пытайся их проверять через публичный прокси и не ходи на их HTML-страницы». Это решает проблему «repository not found».
Установите в терминале (или пропишите в ~/.bashrc / ~/.zshrc):
export GOPRIVATE=github.com/your-org/*
Теперь Go будет игнорировать публичный модульный прокси (proxy.golang.org) для всех репозиториев вашей организации. Команда go get станет напрямую обращаться к Git.
Комбинируем с SSH: GOPRIVATE + настройка ~/.gitconfig — это золотая середина для 90% случаев.
Частые ошибки и их решения
- Ошибка: remote: Repository not found — проверьте
GOPRIVATEи SSH-ключи. Скорее всего, Go пытается зайти через HTTPS без авторизации. - Ошибка: 403 Forbidden — токен в
.netrcне имеет прав на чтение репозитория. Создайте новый токен с правамиrepo. - Ошибка: timeout / connection refused — если вы за корпоративным VPN, настройте
GOPROXY. - Модуль скачался, но не собирается — проверьте версию Go. Для приватных модулей нужен Go 1.13+ (режим модулей).
Как настроить go get для GitLab и Bitbucket?
Принцип тот же, меняется только домен в настройках.
GitLab (SSH):
[url "git@gitlab.com:"]
insteadOf = https://gitlab.com/
Bitbucket (HTTPS с токеном):
machine bitbucket.org
login your-username
password your-app-password
Не забудьте про GOPRIVATE:
export GOPRIVATE=gitlab.com/your-group/*,bitbucket.org/your-team/*
Полный чек-лист для быстрой настройки
- Сгенерируйте SSH-ключ (
ssh-keygen -t rsa -b 4096) и добавьте в аккаунт. - Пропишите в
~/.gitconfigзамену HTTPS на SSH для вашего домена. - Установите
export GOPRIVATE=github.com/your-org/*. - Выполните
go get github.com/your-org/private-repo. - Если не работает — проверьте
~/.netrcс токеном доступа.
Что делать, если ничего не помогает?
Бывает, что все настройки верны, но go get всё равно падает. Тогда:
- Очистите кэш Go:
go clean -modcache - Проверьте версию Git:
git --