Go get de un repositorio privado: ¿por qué es un dolor para los principiantes?
Escribiste un paquete Go genial, lo subiste a GitHub en un repositorio privado, y ahora quieres usarlo en otro proyecto. Ejecutas go get github.com/tunombre/secret-lib — y obtienes un error 403 Forbidden o remote: Repository not found. ¿Te suena?
Esta situación es una de las trampas más comunes para los desarrolladores Go principiantes. La pregunta en Stack Overflow «What's the proper way to "go get" a private repository?» ha acumulado miles de visitas. El problema es que go get por defecto usa HTTPS, no SSH, y no conoce tus credenciales.
En este artículo analizaremos tres formas funcionales de configurar go get para repositorios privados: mediante .gitconfig, .netrc y la variable de entorno GOPRIVATE. Aprenderás cómo evitar errores y ahorrarte horas de depuración.
¿Por qué go get no funciona con repositorios privados?
Por defecto, go get intenta descargar el módulo a través de HTTPS. Para repositorios públicos esto está bien — el acceso anónimo funciona. Pero los repositorios privados requieren autenticación. Go no sabe cómo proporcionar automáticamente usuario/contraseña o token.
El segundo problema es el mecanismo de detección de módulos. Go primero verifica si el repositorio existe en GitHub/GitLab/Bitbucket, analizando la página HTML. Para repositorios privados, esta página no está disponible sin autorización. De ahí el error repository not found, aunque el repositorio exista.
Método 1: modificar ~/.gitconfig (el más sencillo)
La forma más fácil es obligar a Git a usar SSH en lugar de HTTPS para un dominio específico. Añade las siguientes líneas al archivo ~/.gitconfig:
[url "git@github.com:"] insteadOf = https://github.com/Ahora cualquier solicitud a https://github.com/ se reemplazará automáticamente por SSH. Asegúrate de tener configurada una clave SSH y añadida a tu cuenta de GitHub/GitLab.
Verificamos:
go get github.com/tu-org/repo-privado# ¡Funciona sin errores!Importante: este método cambia el comportamiento para todos los repositorios en GitHub. Si solo lo necesitas para uno, usa una configuración más precisa:
[url "git@github.com:tu-org/"] insteadOf = https://github.com/tu-org/Método 2: .netrc para tokens y contraseñas
Si prefieres HTTPS (por ejemplo, en CI/CD), usa el archivo ~/.netrc. Go sabe leer este archivo y proporcionar las credenciales.
Crea el archivo ~/.netrc con permisos 600:
machine github.comlogin tu-usuario-de-githubpassword tu-token-de-acceso-personal¿Dónde obtener el token? En GitHub: Settings → Developer settings → Personal access tokens → Generate new token. Selecciona los permisos repo (para repositorios privados).
Después de esto:
go get github.com/tu-org/repo-privadoPara GitLab:
machine gitlab.comlogin tu-usuario-de-gitlabpassword tu-token-de-acceso-de-gitlabEste método es ideal para CI/CD, donde no siempre es conveniente almacenar claves SSH.
Método 3: GOPRIVATE — salvavidas para módulos
La variable de entorno GOPRIVATE le dice a Go: «Oye, estos módulos son privados, no intentes verificarlos a través del proxy público ni accedas a sus páginas HTML». Esto resuelve el problema de «repository not found».
Configúrala en la terminal (o agrégala a ~/.bashrc / ~/.zshrc):
export GOPRIVATE=github.com/tu-org/*Ahora Go ignorará el proxy público de módulos (proxy.golang.org) para todos los repositorios de tu organización. El comando go get funcionará de