«go get» y GitHub: derribando el muro de «terminal prompts disabled»

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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?

\n\n
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\n

O, aún más misterioso:

\n
go 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\n

En 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!

\n\n

¿Por qué Go se niega a trabajar con repositorios privados?

\n\n

Para entender la causa, debemos mirar «bajo el capó» de Go. Cuando ejecuta go get, la herramienta Go hace varias cosas:

\n\n
    \n
  1. Intenta clonar el repositorio por HTTPS (este es el protocolo predeterminado).
  2. \n
  3. Si el repositorio es privado, Git solicita autenticación (usuario/contraseña).
  4. \n
  5. Go, por defecto, deshabilita las solicitudes interactivas en la terminal — esto es precisamente el «terminal prompts disabled».
  6. \n
\n\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\n

Idea 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\n

Método 1: Usar SSH (el más seguro y correcto)

\n\n

Este es el método recomendado. Las claves SSH son seguras, convenientes y no requieren ingresar una contraseña cada vez.

\n\n

Paso 1. Generar una clave SSH (si no tiene una)

\n

Abra la terminal y ejecute:

\n
ssh-keygen -t ed25519 -C "su_email@example.com"
\n

Presione Enter para guardar la clave en la carpeta estándar (~/.ssh/id_ed25519). Puede agregar una frase de contraseña para mayor seguridad.

\n\n

Paso 2. Agregar la clave al agente SSH

\n
eval "$(ssh-agent -s)"\nssh-add ~/.ssh/id_ed25519
\n\n

Paso 3. Agregar la clave pública a GitHub

\n

Copie el contenido de ~/.ssh/id_ed25519.pub:

\n
cat ~/.ssh/id_ed25519.pub
\n

Vaya a GitHub → Settings → SSH and GPG keys → New SSH key. Pegue la clave y guárdela.

\n\n

Paso 4. Configurar Git para usar SSH

\n

Ahora lo más importante: debe hacer que Go use SSH en lugar de HTTPS. Para ello, edite el archivo ~/.gitconfig:

\n
[url "git@github.com:"]\n    insteadOf = https://github.com/
\n

Esta directiva le dice a Git: «Cuando veas https://github.com/, usa git@github.com: (SSH)».

\n\n

Paso 5. Probar de nuevo

\n
go get github.com/su-cuenta/repositorio-privado@latest
\n

Si todo está configurado correctamente, el error desaparecerá. Go usará SSH para la autenticación y el agente SSH proporcionará la clave.

\n\n

Método 2: Usar un Personal Access Token (PAT) — para CI/CD y scripts

\n\n

SSH es ideal para el desarrollo local.

Blogs

Book Recommendations