Introducción: cuando un simple go get se convierte en un rompecabezas
\n\n¿Alguna vez ha intentado ejecutar go get github.com/su-cuenta/repositorio-privado y recibió un mensaje frío y poco amigable?
go get github.com/su-cuenta/repositorio-privado: \n module github.com/su-cuenta/repositorio-privado: \n git ls-remote -q origin in /tmp/...: exit status 128:\n remote: Invalid username or password.\n fatal: Authentication failed for 'https://github.com/su-cuenta/repositorio-privado.git'\n\nO, aún más misterioso:
\ngo get github.com/su-cuenta/repositorio-privado: \n terminal prompts disabled\n Confirm the import path was entered correctly.\n If this is a private repo, see https://golang.org/doc/faq#git_https\n\n¿Le suena familiar? Si es así, ha llegado al lugar indicado. Este error es un «obstáculo clásico» para los desarrolladores de Go que trabajan con repositorios privados en GitHub. En Stack Overflow, esta pregunta ha acumulado miles de visitas, y hoy la resolveremos de una vez por todas.
\n\nEn este artículo no solo solucionaremos el problema, sino que entenderemos por qué ocurre y aprenderemos a configurar el entorno para que go get funcione con repositorios privados como si fuera mantequilla. ¡Allá vamos!
¿Por qué Go se niega a trabajar con repositorios privados?
\n\nPara entender la causa, debemos mirar «bajo el capó» de Go. Cuando ejecuta go get, la herramienta Go hace varias cosas:
- \n
- Intenta clonar el repositorio por HTTPS (este es el protocolo predeterminado). \n
- Si el repositorio es privado, Git solicita autenticación (usuario/contraseña). \n
- Go, por defecto, deshabilita las solicitudes interactivas en la terminal — esto es precisamente el «terminal prompts disabled». \n
¿Por qué Go hace esto? Es simple: en compilaciones automáticas o en pipelines CI/CD, la entrada interactiva de contraseñas es imposible. Por lo tanto, Go prefiere «fallar» con un error antes que quedarse esperando una entrada.
\n\nIdea clave: el error «terminal prompts disabled» no es un bug, sino una característica. Go le dice: «No puedo pedirte la contraseña, dame credenciales listas». Y nuestra tarea es proporcionarlas.
\n\nMétodo 1: Usar SSH (el más seguro y correcto)
\n\nEste es el método recomendado. Las claves SSH son seguras, convenientes y no requieren ingresar una contraseña cada vez.
\n\nPaso 1. Generar una clave SSH (si no tiene una)
\nAbra la terminal y ejecute:
\nssh-keygen -t ed25519 -C "su_email@example.com"\nPresione Enter para guardar la clave en la carpeta estándar (~/.ssh/id_ed25519). Puede agregar una frase de contraseña para mayor seguridad.
Paso 2. Agregar la clave al agente SSH
\neval "$(ssh-agent -s)"\nssh-add ~/.ssh/id_ed25519\n\nPaso 3. Agregar la clave pública a GitHub
\nCopie el contenido de ~/.ssh/id_ed25519.pub:
cat ~/.ssh/id_ed25519.pub\nVaya a GitHub → Settings → SSH and GPG keys → New SSH key. Pegue la clave y guárdela.
\n\nPaso 4. Configurar Git para usar SSH
\nAhora lo más importante: debe hacer que Go use SSH en lugar de HTTPS. Para ello, edite el archivo ~/.gitconfig:
[url "git@github.com:"]\n insteadOf = https://github.com/\nEsta directiva le dice a Git: «Cuando veas https://github.com/, usa git@github.com: (SSH)».
Paso 5. Probar de nuevo
\ngo get github.com/su-cuenta/repositorio-privado@latest\nSi todo está configurado correctamente, el error desaparecerá. Go usará SSH para la autenticación y el agente SSH proporcionará la clave.
\n\nMétodo 2: Usar un Personal Access Token (PAT) — para CI/CD y scripts
\n\nSSH es ideal para el desarrollo local.