Problemas, Errores y Soluciones con GIT

Trucos y Utilidades 5 de mar. de 2024

Servidores Git

Existen muchos servicios para mantener nuestro código bajo un control de versiones: Github, GitLab, Gitea, Forgejo, Bitbucket, Gogs, Trac, etc.

Algunos incluso disponen de su propia herramienta CLI (de línea de comando) para simplificar los comandos estándar de git.

Si trabajamos con varios de ellos, incluso con los auto-alojados, vamos a querer simplificar el poder subir nuestro código a cualquiera de los distintos servidores Git de una forma sencilla sin tener que estar continuamente recordando usuarios/claves, etc...

Config para GIT con SSH

No todos los servicios Git, dependiendo de como estén configurados nos van a permitir subir mediante el protocolo http/https los ficheros y nos van a obligar a usar el protocolo SSH o incluso un Token.
Es una buena práctica por seguridad configurar el uso de ssh, para trabajar con git y subir los cambios a los repositorios.

Para trabajar con SSH, necesitaremos generar un par de claves (pública y privada) que usaremos para comunicarnos de forma segura con cada uno de los servidores.

Personalmente me gusta crear diferentes pares de claves para cada uno de los servidores con los que trabajo, aunque la gente suele usar uno único por simplicidad.

Para generar un par de claves (publica y privada) para su uso en los diferentes servidores git, usaremos el comando ssh-keygen.

Si no lo tenemos instalado en nuestro Debian, simplemente abriremos una terminal y escribiremos lo siguiente:

sudo apt -y install openssh-client

Ahora tenemos 2 opciones:

  • Generar automaticamente el directorio .ssh y nuestro primer par de claves por defecto (id_rsa y id_rsa.pub):
    ssh-keygen
    Pulsamos Intro varias veces (si la pide, no ponemos contraseña) hasta volver al prompt del sistema.

  • Generar manualmente el directorio .ssh y ajustar los permisos:
    mkdir ~/.ssh; chmod 0700 ~/.ssh

Debes de revisar la información del servicio git que uses en el que te indicarán que tipos de claves están permitidas y cuales no.

Por defecto actualmente ssh-keygen genera una clave de tipo RSA de 3072 bits.
Si necesitas crear una de otro tipo debes de usar el parámetro -t y si necesitas cambiar el tamaño del número de bits ,deberás usar el parámetro -b

  • GitLab:
    Recomienda usar: -t ed25519 ó -t rsa -b 4096

  • GitHub:
    Recomienda usar: -t ed25519 ó -t rsa -b 4096 y las claves de tipo DSA ya no están soportadas.

  • Bitbucket:
    Permite: -t ed25519 -b 256, -t ecdsa -b 256, -t rsa -b 2048 y -t dsa -b 1024

  • Gitea y Forgejo:
    Soportan: -t ed25519 -b 256, -t ecdsa -b 256, -t rsa -b 3071 y DSA no está ya soportado.

Ahora vamos a crear un conjunto de claves a las que pondremos un "nombre identificativo" para distinguirlas:

# Crear par de claves (privada y pública) para servidor XYZ
# Cambiar XYZ por el deseado (github, gitlab, etc)
ssh-keygen -C 'Servidor Git XYZ' -f ~/.ssh/id_XYZ

Se crearán dentro del directorio .ssh del home de nuestro usuario, dos ficheros:

  • id_XYZ (La clave privada)
  • id_XYZ.pub (La clave pública)

En el servidor GIT en que vayas a usar SSH para la conexión, subida/descarga de código, deberás incluir el contenido de tu clave PUBLICA en él, en la zona de configuración indicada para ello, generalmente lo encontrarás si pulsas sobre tu perfil, y luego en "Configuración" ó "Settings", allí veras un apartado que se suele llamar "SSH/GPG Keys" desde el que podrás incluir la parte pública del par de claves generadas.

Para facilitar al comando GIT la clave que debe de usar para la conexión debes crearte un fichero 'config' (en la ruta ~/.ssh) en el que indicar que clave usar en cada servidor, para ello, simplemente abre un terminal y escribe lo siguiente:

# Crear fichero CONFIG y ajustar permisos
touch ~/.ssh/config
chmod 0600 ~/.ssh/config

Con tu editor favorito (por ejemplo vi) edita el fichero 'config' e incluye las siguientes líneas (dependiendo de los servidores a los que te conectarás), en la configuración debes indicar siempre la clave PRIVADA.
Lo mostrado aquí es un ejemplo:

Host github.com
  HostName github.com
  IdentityFile ~/.ssh/id_github

Host gitlab.com
  HostName gitlab.com
  IdentityFile ~/.ssh/id_gitlab

Host forgejo.auto-alojado.org
  HostName forgejo
  IdentityFile ~/.ssh/id_forgejo

Para clonar (descargar) tu propio código deberás usar ahora con git el formato SSH, en vez de usar HTTPS.

Cambiar repositorio local para que apunte de HTTPS a SSH

Si tienes un repositorio descargado y lo clonaste mediante HTTPS, puedes modificar su comportamiento para que funcione con SSH, para ello desde la terminal y dentro del repositorio realiza lo siguiente:

Con el comando GIT, obtenemos la URL del servidor remoto (donde subimos con push):

git info|grep 'remote.origin.url'

Nos sacará una salida parecida a esto:

remote.origin.url=https://ServidorGIT/usuario/repositorio.git

Nos apuntamos los datos que muestra despues de https://

  • El nombre del servidor git: ServidorGIT
  • Tu identificador/login de usuario: usuario
  • El nombre del repositorio actual: repositorio.git

Ahora mediante el comando git, cambiamos al formato SSH (con los datos obtenidos antes):

git remote set-url origin git@ServidorGIT:usuario/repositorio.git

Error: 'send-pack unexpected disconnect while reading sideband packet'

Este 'horror' se puede producir por varias causas, las más habituales son:

  • Incluir ficheros muy grandes
  • Red o conexión con errores
  • Configuración incorrecta

Si se da el caso de que tengas algún fichero demasiado "pesado" debes de incrementar el tamaño del buffer para permitir al comando git subir el fichero.
Prueba a aumentar hasta 1 Gb el tamaño máximo de ficheros a enviar, desde el terminal escribe el siguiente comando:

git config --global http.postBuffer 1048576000

Si los problema surgen por conectividad/red, prueba a cambiar los límites de timeout mediante las siguientes instrucciones, para dar tiempo al servidor a que te responda:

git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999

Error: 'Faltal: out fo memory, realloc failed'

Este error se puede producir cuando se clona algún repositorio. Para solucionarlo simplemente edita el fichero de configuración de git (~/.gitconfig) e incluye en el las siguientes líneas:

[core] 
  packedGitLimit = 512m
  packedGitWindowSize = 512m 
[pack] 
  deltaCacheSize = 2047m 
  packSizeLimit = 2047m 
  windowMemory = 2047m

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux