Go get приватный репозиторий: пошаговое руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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/*

Полный чек-лист для быстрой настройки

  1. Сгенерируйте SSH-ключ (ssh-keygen -t rsa -b 4096) и добавьте в аккаунт.
  2. Пропишите в ~/.gitconfig замену HTTPS на SSH для вашего домена.
  3. Установите export GOPRIVATE=github.com/your-org/*.
  4. Выполните go get github.com/your-org/private-repo.
  5. Если не работает — проверьте ~/.netrc с токеном доступа.

Что делать, если ничего не помогает?

Бывает, что все настройки верны, но go get всё равно падает. Тогда:

  • Очистите кэш Go: go clean -modcache
  • Проверьте версию Git: git --

Блоги

Рекомендаций по книгам