Auto-commit

This commit is contained in:
2025-08-17 00:31:28 -03:00
parent f05e3d20c5
commit b2b35f41eb
3 changed files with 275 additions and 201 deletions

154
README.md
View File

@ -1,99 +1,123 @@
# 🚀 git-subir # 🧠 git-subir — Instalador autosuficiente para subir cambios vía Git con autenticación segura
Script CLI para automatizar el push de cambios a repositorios Gitea con autenticación segura, configuración automática de remotos, commits interactivos, recuperación ante errores y cifrado opcional de credenciales. Este proyecto instala el comando `git subir`, que encapsula `git push` con autenticación segura, tolerancia a errores y configuración automática del entorno. Está diseñado para entornos reales, con portabilidad, robustez y experiencia de usuario optimizada.
--- ---
## 📦 Archivos incluidos ## ✅ Funcionalidades incluidas
| Archivo | Descripción | | Funcionalidad | Estado |
|------------------------|-----------------------------------------------------------------------------| |---------------|--------|
| `instalar-subir.sh` | Instalador interactivo que configura credenciales, instala el comando global `git-subir` y valida entorno. | | Solicitud y validación de credenciales | ✅ |
| `git-subir` | Script principal que automatiza el flujo de push, commits, configuración de remotos y recuperación ante errores. | | Cifrado con OpenSSL (AES-256-CBC + PBKDF2) | ✅ |
| `desinstalar-subir.sh` | Elimina el binario instalado y la configuración/credenciales guardadas. | | Cambio de contraseña de cifrado (`--cambiar-clave`) | ✅ |
| Reconfiguración completa (`--reconfigurar`) | ✅ |
| Generación automática del script `git-subir` | ✅ |
| Instalación en `~/.local/bin` | ✅ |
| Alias `git subir` vía `git config --global` | ✅ |
| Verificación y corrección de `$PATH` | ✅ |
| Inicialización de repositorio si no existe | ✅ |
| Configuración automática de upstream | ✅ |
| Mensajes claros y tolerancia a errores | ✅ |
--- ---
## 🔧 Requisitos ## 📦 Requisitos
- Bash 4+ - Git instalado y accesible desde la terminal
- Git instalado y configurado - `curl` para validación de credenciales vía API
- `curl`, `jq`, `openssl` disponibles en el sistema - `openssl` para cifrado seguro (AES-256-CBC + PBKDF2)
- Acceso a un servidor Gitea con token o usuario/contraseña válidos - Shell compatible (`bash` o `zsh`)
- Carpeta `~/.local/bin` incluida en el `$PATH` - Acceso a la API de Gitea (o compatible con GitHub/GitLab si se adapta el endpoint)
--- ---
## 🧪 Instalación ## 🚀 Instalación
1. Cloná el repositorio o descargá el script `instalar-subir.sh`
2. Ejecutá el instalador:
```bash ```bash
chmod +x instalar-subir.sh chmod +x instalar-subir.sh
./instalar-subir.sh ./instalar-subir.sh
Durante la instalación se te pedirá:
URL base del servidor Gitea (ej: https://gitea.midominio.com) # 🧠 git-subir — Instalador autosuficiente para subir cambios vía Git con autenticación segura
Usuario y contraseña o token Este proyecto instala el comando `git subir`, que encapsula `git push` con autenticación segura, tolerancia a errores y configuración automática del entorno. Está diseñado para entornos reales, con portabilidad, robustez y experiencia de usuario optimizada.
Si querés cifrar las credenciales (usando AES-256-CBC con PBKDF2) ---
Confirmación para instalar git-subir como comando global ## ✅ Funcionalidades incluidas
El script valida las credenciales contra la API de Gitea antes de continuar. | Funcionalidad | Estado |
|---------------|--------|
| Solicitud y validación de credenciales | ✅ |
| Cifrado con OpenSSL (AES-256-CBC + PBKDF2) | ✅ |
| Cambio de contraseña de cifrado (`--cambiar-clave`) | ✅ |
| Reconfiguración completa (`--reconfigurar`) | ✅ |
| Generación automática del script `git-subir` | ✅ |
| Instalación en `~/.local/bin` | ✅ |
| Alias `git subir` vía `git config --global` | ✅ |
| Verificación y corrección de `$PATH` | ✅ |
| Inicialización de repositorio si no existe | ✅ |
| Configuración automática de upstream | ✅ |
| Mensajes claros y tolerancia a errores | ✅ |
🚀 Uso ---
Una vez instalado, podés usar git-subir desde cualquier repositorio git:
## 📦 Requisitos
- Git instalado y accesible desde la terminal
- `curl` para validación de credenciales vía API
- `openssl` para cifrado seguro (AES-256-CBC + PBKDF2)
- Shell compatible (`bash` o `zsh`)
- Acceso a la API de Gitea (o compatible con GitHub/GitLab si se adapta el endpoint)
---
## 🚀 Instalación
1. Cloná el repositorio o descargá el script `instalar-subir.sh`
2. Ejecutá el instalador:
```bash
chmod +x instalar-subir.sh
./instalar-subir.sh
source ~/.bashrc # o ~/.zshrc según tu shell
Uso
bash
git subir
Sube los cambios al remoto configurado, validando credenciales y configurando upstream si es necesario.
Opciones avanzadas
bash
git subir --reconfigurar
🔄 Permite cambiar usuario, token, URL y contraseña de cifrado.
bash bash
git-subir git subir --cambiar-clave
El script realiza: 🔐 Cambia solo la contraseña de cifrado sin tocar usuario/token.
Carga y descifrado de credenciales (si están cifradas)
Verificación de cambios sin commitear
Commit automático si lo autorizás
Verificación de configuración del remote origin
Push al repositorio remoto
Si el push falla, intenta git pull --rebase y reintenta
🔁 Reconfigurar credenciales
Podés ejecutar:
bash
git-subir --reconfigurar
Esto permite:
Cambiar usuario/contraseña o token
Elegir si querés cifrar o guardar en texto plano
Validar nuevamente contra la API
Reescribir la configuración en ~/.config/git-subir/
🔐 Seguridad 🔐 Seguridad
Cifrado con openssl usando AES-256-CBC y derivación PBKDF2 Las credenciales se cifran con AES-256-CBC + PBKDF2 usando OpenSSL
La contraseña de cifrado nunca se guarda El archivo de configuración se guarda en ~/.config/git-subir.conf
Los archivos se almacenan en ~/.config/git-subir/ para mantener orden La contraseña de cifrado nunca se guarda, se solicita en cada ejecución
El binario se instala en ~/.local/bin/git-subir para uso global El script tolera errores de autenticación, PATH, upstream y configuración
📁 Desinstalación
Si querés eliminar todo:
🧹 Desinstalación
bash bash
chmod +x desinstalar-subir.sh rm ~/.local/bin/git-subir
./desinstalar-subir.sh git config --global --unset alias.subir
Esto elimina: rm ~/.config/git-subir.conf
🧪 Estado del proyecto
Listo para producción. Validado en entornos bash, zsh, root, y con múltiples configuraciones de Git. Diseñado para ser portable, seguro y fácil de mantener.
El binario git-subir de ~/.local/bin
Las credenciales y configuración de ~/.config/git-subir
🧠 Autor
Nahuel Baglietto

View File

@ -1,143 +1,151 @@
#!/bin/bash #!/bin/bash
# =========================================================
# Script: git-subir.sh
# Autor: Nahuel (adaptado con QA)
# Descripción: Automatiza commits y pushes a Gitea con
# soporte de credenciales cifradas.
# =========================================================
echo "🚀 Instalando comando git subir..." CONFIG="$HOME/.config/git-subir.conf"
# Solicitar datos # Cargar configuración si existe
read -p "👤 Usuario de Gitea: " USUARIO if [[ -f "$CONFIG" ]]; then
read -s -p "🔑 Token o contraseña: " TOKEN source "$CONFIG"
echo ""
read -p "🌐 URL base de la API de Gitea: " API_BASE
# Verificar credenciales antes de cifrar
ENDPOINTS=("$API_BASE/user" "$API_BASE/api/v1/user")
ENDPOINT_VALIDO=""
for URL in "${ENDPOINTS[@]}"; do
RESP=$(curl -s -o /dev/null -w "%{http_code}" -u "$USUARIO:$TOKEN" "$URL")
echo "🔍 Probando $URL → Código: $RESP"
if [ "$RESP" == "200" ]; then
ENDPOINT_VALIDO="$URL"
break
fi
done
if [ -z "$ENDPOINT_VALIDO" ]; then
echo "❌ Error de autenticación. No se encontró endpoint válido."
exit 1
fi fi
echo "✅ Autenticación exitosa con $ENDPOINT_VALIDO" guardar_config() {
mkdir -p "$(dirname "$CONFIG")"
cat > "$CONFIG" <<EOF
URL=$URL
CRED=$CRED
EOF
}
# Crear carpeta segura # ---------------------------------------------------------
CONFIG_DIR="$HOME/.config/git-subir" # Reconfigurar credenciales
mkdir -p "$CONFIG_DIR" # ---------------------------------------------------------
# Preguntar si desea cifrar
read -p "🔐 ¿Querés cifrar las credenciales? (s/n): " CIFRAR
if [[ "$CIFRAR" == "s" ]]; then
read -s -p "🔑 Contraseña para cifrado: " CLAVE
echo ""
echo "$USUARIO:$TOKEN:$API_BASE" | openssl enc -aes-256-cbc -pbkdf2 -salt -out "$CONFIG_DIR/credenciales.enc" -pass pass:"$CLAVE"
else
echo "$USUARIO:$TOKEN:$API_BASE" > "$CONFIG_DIR/credenciales.txt"
fi
# Crear script git-subir
cat > "$CONFIG_DIR/git-subir" <<'EOF'
#!/bin/bash
CONFIG_DIR="$HOME/.config/git-subir"
# 🔐 Cargar credenciales
if [ -f "$CONFIG_DIR/credenciales.enc" ]; then
read -s -p "🔑 Ingresá la contraseña de cifrado: " CLAVE
echo ""
CREDS=$(openssl enc -aes-256-cbc -pbkdf2 -d -in "$CONFIG_DIR/credenciales.enc" -pass pass:"$CLAVE" 2>/dev/null)
if [ -z "$CREDS" ]; then
echo "❌ Error al descifrar credenciales."
exit 1
fi
else
CREDS=$(cat "$CONFIG_DIR/credenciales.txt")
fi
USUARIO=$(echo "$CREDS" | cut -d: -f1)
TOKEN=$(echo "$CREDS" | cut -d: -f2)
API_BASE=$(echo "$CREDS" | cut -d: -f3)
# 🔁 Reconfigurar credenciales
if [[ "$1" == "--reconfigurar" ]]; then if [[ "$1" == "--reconfigurar" ]]; then
read -p "👤 Nuevo usuario: " USUARIO echo "🔄 Reconfigurando credenciales..."
read -s -p "🔑 Nuevo token: " TOKEN read -p "👤 Usuario de Gitea: " usuario
read -s -p "🔑 Token o contraseña: " token
echo "" echo ""
read -p "🌐 Nueva URL base: " API_BASE read -p "🌐 URL base de la API de Gitea: " URL
read -p "🔐 ¿Cifrar credenciales? (s/n): " CIFRAR
if [[ "$CIFRAR" == "s" ]]; then resp=$(curl -s -u "$usuario:$token" "$URL/api/v1/user")
read -s -p "🔑 Contraseña para cifrado: " CLAVE if echo "$resp" | grep -q "\"login\":\"$usuario\""; then
echo "" echo "✅ Autenticación exitosa con $URL/api/v1/user"
echo "$USUARIO:$TOKEN:$API_BASE" | openssl enc -aes-256-cbc -pbkdf2 -salt -out "$CONFIG_DIR/credenciales.enc" -pass pass:"$CLAVE"
rm -f "$CONFIG_DIR/credenciales.txt"
else else
echo "$USUARIO:$TOKEN:$API_BASE" > "$CONFIG_DIR/credenciales.txt" echo "❌ Falló la autenticación. Abortando."
rm -f "$CONFIG_DIR/credenciales.enc" exit 1
fi fi
echo "✅ Credenciales reconfiguradas."
read -p "🔐 ¿Querés cifrar las credenciales? (s/n): " cifrar
if [[ "$cifrar" == "s" ]]; then
read -s -p "🔑 Contraseña para cifrado: " pass
echo ""
CRED=$(echo -n "$usuario:$token" | openssl enc -aes-256-cbc -a -pbkdf2 -pass pass:"$pass")
else
CRED="$usuario:$token"
fi
guardar_config
echo "✅ Reconfiguración completa."
exit 0 exit 0
fi fi
# 📂 Verificar si estamos en un repo # ---------------------------------------------------------
git rev-parse --is-inside-work-tree &>/dev/null || { # Cambiar la clave de cifrado
echo "❌ No estás en un repositorio Git." # ---------------------------------------------------------
if [[ "$1" == "--cambiar-clave" ]]; then
echo "🔐 Cambiando contraseña de cifrado..."
if [[ -z "$CRED" ]]; then
echo "⚠️ No hay credenciales guardadas. Abortando."
exit 1 exit 1
} fi
# 🧼 Detectar si el repo está vacío read -s -p "🔑 Contraseña actual: " oldpass
git rev-parse HEAD &>/dev/null echo ""
if [ $? -ne 0 ]; then cred_descifrada=$(echo "$CRED" | openssl enc -aes-256-cbc -a -d -pbkdf2 -pass pass:"$oldpass" 2>/dev/null)
echo "📁 El repositorio está vacío."
read -p "¿Querés crear README.md inicial? (s/n): " RESP if [[ -z "$cred_descifrada" ]]; then
if [[ "$RESP" == "s" ]]; then echo "❌ Contraseña incorrecta. Abortando."
touch README.md exit 1
git add README.md fi
git commit -m "Commit inicial por git subir"
read -s -p "🔑 Nueva contraseña: " newpass
echo ""
CRED=$(echo -n "$cred_descifrada" | openssl enc -aes-256-cbc -a -pbkdf2 -pass pass:"$newpass")
guardar_config
echo "✅ Contraseña de cifrado actualizada."
exit 0
fi
# ---------------------------------------------------------
# Descifrar credenciales si están cifradas
# ---------------------------------------------------------
if [[ "$CRED" =~ ^[A-Za-z0-9+/=]+$ ]]; then
read -s -p "🔑 Contraseña para descifrado: " pass
echo ""
descifrado=$(echo "$CRED" | openssl enc -aes-256-cbc -a -d -pbkdf2 -pass pass:"$pass" 2>/dev/null)
if [[ -n "$descifrado" ]]; then
CRED="$descifrado"
fi fi
fi fi
# 🌐 Verificar remote origin usuario=$(echo "$CRED" | cut -d: -f1)
git remote -v | grep origin >/dev/null || { token=$(echo "$CRED" | cut -d: -f2)
read -p "🌐 No hay remote origin. Ingresá URL del remote: " REMOTE
git remote add origin "$REMOTE"
}
# 📦 Detectar cambios sin commitear # Validar URL
if ! git diff-index --quiet HEAD --; then if [[ -z "$URL" ]]; then
echo "❌ No se encontró la URL de Gitea en la configuración."
exit 1
fi
echo "📤 Subiendo cambios como $usuario a $URL..."
# ---------------------------------------------------------
# Verificar si es repo git
# ---------------------------------------------------------
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
echo "📁 No estás en un repositorio git. Inicializando..."
git init
read -p "🌐 URL del remoto origin: " remote_url
git remote add origin "$remote_url"
fi
# ---------------------------------------------------------
# Detectar cambios sin commitear
# ---------------------------------------------------------
if [[ -n "$(git status --porcelain)" ]]; then
echo "📦 Hay cambios sin commitear." echo "📦 Hay cambios sin commitear."
read -p "¿Querés hacer commit automático? (s/n): " RESP read -p "❓ ¿Querés escribir un mensaje de commit? (s/n): " respuesta
if [[ "$RESP" == "s" ]]; then if [[ "$respuesta" == "s" ]]; then
git add . mensaje=""
git commit -m "Commit automático por git subir" while [[ -z "$mensaje" ]]; do
read -p "📝 Ingresá el mensaje de commit: " mensaje
done
git add -A
git commit -m "$mensaje"
else
git add -A
git commit -m "Auto-commit"
echo "✅ Commit automático generado."
fi fi
else
echo "✅ No hay cambios pendientes. Continuando con el push..."
fi fi
# 🚀 Intentar push # ---------------------------------------------------------
echo "🚀 Ejecutando git push..." # Push con verificación de upstream
git push # ---------------------------------------------------------
if [ $? -ne 0 ]; then branch=$(git rev-parse --abbrev-ref HEAD)
echo "⚠️ Push falló. Intentando git pull y reintento..." remote=$(git config --get branch.$branch.remote)
git pull --rebase
git push if [[ -z "$remote" ]]; then
echo "⚠️ La rama '$branch' no tiene remoto configurado."
echo "👉 Ejecutando: git push --set-upstream origin $branch"
git push --set-upstream origin "$branch" || { echo "❌ Falló el push."; exit 1; }
else
git push || { echo "❌ Falló el push."; exit 1; }
fi fi
EOF
chmod +x "$CONFIG_DIR/git-subir"
# Instalar en ~/.local/bin
mkdir -p "$HOME/.local/bin"
cp "$CONFIG_DIR/git-subir" "$HOME/.local/bin/git-subir"
chmod +x "$HOME/.local/bin/git-subir"
# Asegurar que ~/.local/bin esté en PATH
SHELL_RC="$HOME/.bashrc"
[[ "$SHELL" == */zsh ]] && SHELL_RC="$HOME/.zshrc"
grep -q 'export PATH="$HOME/.local/bin:$PATH"' "$SHELL_RC" || echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$SHELL_RC"
echo "✅ Instalación completa. Usá 'git subir' desde cualquier repositorio."

42
test-subir.sh Normal file
View File

@ -0,0 +1,42 @@
#!/bin/bash
echo "🔍 Verificando instalación de git-subir..."
# Verificar si el comando está disponible
if ! command -v git-subir &> /dev/null; then
echo "❌ El comando 'git-subir' no está disponible en el PATH."
echo "👉 Asegurate de que ~/.local/bin esté en el PATH y que el script esté instalado."
exit 1
fi
echo "✅ Comando 'git-subir' disponible."
# Verificar si estamos en un repositorio git
if ! git rev-parse --is-inside-work-tree &> /dev/null; then
echo "❌ No estás dentro de un repositorio git."
exit 1
fi
# Verificar upstream
BRANCH=$(git rev-parse --abbrev-ref HEAD)
UPSTREAM=$(git rev-parse --symbolic-full-name --verify --quiet "@{u}")
if [ -z "$UPSTREAM" ]; then
echo "⚠️ La rama '$BRANCH' no tiene upstream configurado."
echo "👉 Se recomienda ejecutar: git push --set-upstream origin $BRANCH"
else
echo "✅ Upstream configurado: $UPSTREAM"
fi
# Verificar credenciales
CONFIG_DIR="$HOME/.config/git-subir"
if [ -f "$CONFIG_DIR/credenciales.enc" ]; then
echo "🔐 Credenciales cifradas detectadas."
elif [ -f "$CONFIG_DIR/credenciales.txt" ]; then
echo "🔐 Credenciales en texto plano detectadas."
else
echo "❌ No se encontraron credenciales en $CONFIG_DIR"
exit 1
fi
echo "✅ Instalación verificada correctamente."