Problemas, Errores y Soluciones con GIT
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