diff --git a/README.md b/README.md index 8f3880b..00cc599 100644 --- a/README.md +++ b/README.md @@ -1,83 +1,77 @@ -<<<<<<< HEAD -# 🚀 Comando `git subir` +# 🛠️ Git Subir – Automatización de Push con Gitea -Este script automatiza el proceso de subir cambios a un repositorio Gitea, manejando credenciales, commits, conflictos y merges de forma inteligente. Se instala como un comando global llamado `git subir`, que podés usar desde cualquier repositorio Git. +Este paquete te permite ejecutar `git subir` como un comando personalizado que: + +- Detecta cambios sin commitear +- Realiza commit automático si lo deseás +- Maneja push con credenciales de Gitea +- Resuelve conflictos de merge automáticamente +- Valida credenciales antes de instalarse --- -## 🧩 Funcionalidades - -- ✅ Verifica que estés dentro de un repositorio Git. -- 🔐 Solicita usuario y contraseña/token de Gitea. -- 📦 Detecta cambios sin commitear y ofrece hacer commit automático. -- 🔄 Maneja conflictos entre el repositorio local y remoto. -- 🔀 Realiza merge automático si hay conflictos. -- 🧠 Reintenta el `push` después de resolver conflictos. -- 🛠️ Se instala globalmente como comando `git subir`. - ---- - -## 🛠️ Instalación - -### 1. Guardá el instalador - -Copiá el script de instalación en un archivo llamado `instalar-subir.sh`. - -### 2. Asigná permisos y ejecutalo +## 📦 Instalación ```bash chmod +x instalar-subir.sh ./instalar-subir.sh +Durante la instalación se te pedirá: -Esto hará lo siguiente: -📁 Crea la carpeta ~/.scripts si no existe. +Usuario de Gitea -📄 Copia el script funcional como git-subir dentro de esa carpeta. +Contraseña o token -🔓 Le da permisos de ejecución. +Validación automática contra el servidor -🛣️ Agrega ~/.scripts al PATH si no está. - -Uso: -Desde cualquier repositorio Git, simplemente ejecutá: +🚀 Uso +Desde cualquier repositorio Git: bash git subir +El script: -El script te guiará paso a paso: +Detecta cambios sin commitear -🔐 Te pedirá tus credenciales de Gitea. +Te pregunta si querés hacer commit automático -📦 Detectará si hay cambios sin commitear y te ofrecerá hacer commit. +Intenta hacer git push con tus credenciales -🚀 Intentará hacer push al repositorio remoto. +Si falla, hace git pull --allow-unrelated-histories -🔄 Si el push falla por historial diferente, hará pull con --allow-unrelated-histories. - -⚔️ Si hay conflictos, te mostrará los archivos afectados y te preguntará si querés hacer un merge automático. - -✅ Reintentará el push después de resolver conflictos. -Requisitos -Tener Git instalado. - -Tener acceso a un repositorio remoto en Gitea. - -Estar dentro de un repositorio Git local al ejecutar el comando. - -🧼 Desinstalación -Si querés eliminar el comando: +Detecta conflictos y te pregunta si querés hacer merge automático +🧹 Desinstalación bash -rm ~/.scripts/git-subir -Y si querés quitar la carpeta del PATH, podés editar tu ~/.bashrc o ~/.zshrc y eliminar la línea: +chmod +x desinstalar-subir.sh +./desinstalar-subir.sh +Esto elimina: -bash +El alias git subir -export PATH="$HOME/.scripts:$PATH" +El script principal -📬 Autor -Este script fue creado por Nahuel Baglietto para automatizar flujos de trabajo con Gitea. ¿Tenés sugerencias o querés mejorarlo? ¡Contribuciones bienvenidas! -======= -# git-operaciones +Las credenciales guardadas ->>>>>>> f0ba71ff0559f7673229e8b14ba5848b8c530500 +📁 Archivos creados +~/.scripts/git-subir.sh: script principal + +~/.scripts/.env: credenciales (modo seguro) + +/usr/local/bin/git-subir: alias ejecutable + +🔐 Seguridad +Las credenciales se guardan en modo 600 (solo lectura para el usuario). + +No se comparten ni se suben a ningún repositorio. + +Podés borrarlas en cualquier momento con el desinstalador. + +🧩 Requisitos +Git instalado + +Acceso a Gitea con token o contraseña + +Permisos para escribir en /usr/local/bin + +🧠 Autor +Este sistema fue diseñado para automatizar flujos Git en entornos con Gitea, optimizando la experiencia de push y manejo de conflictos. diff --git a/desinstalar-subir.sh b/desinstalar-subir.sh new file mode 100644 index 0000000..d0fa34d --- /dev/null +++ b/desinstalar-subir.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -e + +echo "🧹 Eliminando alias git-subir..." +sudo rm -f /usr/local/bin/git-subir + +echo "🧹 Eliminando script principal..." +rm -f "$HOME/.scripts/git-subir.sh" + +echo "🧹 Eliminando credenciales..." +rm -f "$HOME/.scripts/.env" + +echo "✅ Desinstalación completa." diff --git a/instalar-subir.sh b/instalar-subir.sh index 0e1237c..902f762 100755 --- a/instalar-subir.sh +++ b/instalar-subir.sh @@ -1,100 +1,95 @@ #!/bin/bash +set -e -# ╔════════════════════════════════════════════════════╗ -# ║ VERIFICACIÓN DE REPOSITORIO GIT ║ -# ╚════════════════════════════════════════════════════╝ +# 📁 Crear directorio de scripts +mkdir -p "$HOME/.scripts" -if ! git rev-parse --is-inside-work-tree > /dev/null 2>&1; then - echo "" - echo "🛑 Este comando debe ejecutarse dentro de un repositorio Git." +# 📜 Copiar script principal +cat <<'EOF' > "$HOME/.scripts/git-subir.sh" +#!/bin/bash +set -e + +source "$HOME/.scripts/.env" + +remote_url=$(git remote get-url origin | sed 's|https://||') +auth_url="https://$GITEA_USER:$GITEA_TOKEN@$remote_url" + +function marco() { + echo -e "╔════════════════════════════════╗" + echo -e "║ $1" + echo -e "╚════════════════════════════════╝" +} + +# 📦 Detectar cambios sin commitear +if ! git diff-index --quiet HEAD; then + echo "📦 Se detectaron cambios sin commitear:" + git status -s + + read -p "¿Querés hacer commit automático de estos cambios? (s/n): " auto_commit + if [[ "$auto_commit" == "s" ]]; then + read -p "📝 Ingresá el mensaje de commit: " mensaje + git add . + git commit -m "$mensaje" + echo "✅ Commit realizado." + fi +fi + +# 🚀 Intentar push +echo "🚀 Subiendo archivos al repositorio remoto..." +if ! git push "$auth_url"; then + echo "⚠️ Push fallido. Intentando pull con --allow-unrelated-histories..." + git pull "$auth_url" --allow-unrelated-histories || true + + conflictos=$(git diff --name-only --diff-filter=U) + if [[ -n "$conflictos" ]]; then + echo "🚨 Conflictos detectados:" + echo "$conflictos" + read -p "¿Hacer merge automático? (s/n): " merge_auto + if [[ "$merge_auto" == "s" ]]; then + git add . + git commit -m "🔀 Merge automático" + else + echo "❌ Merge cancelado. Resolvé los conflictos manualmente." + exit 1 + fi + fi + + git push "$auth_url" +fi + +echo "🎉 Push completado." +EOF + +chmod +x "$HOME/.scripts/git-subir.sh" + +# 🔗 Crear alias ejecutable +echo "Creando alias git-subir..." +cat < /dev/null +#!/bin/bash +exec "$HOME/.scripts/git-subir.sh" "\$@" +EOF + +sudo chmod +x /usr/local/bin/git-subir + +# 🔐 Credenciales +echo "🔐 Configurando credenciales de Gitea..." +read -p "Usuario de Gitea: " GITEA_USER +read -s -p "Contraseña o Token: " GITEA_TOKEN +echo "" + +echo "🔎 Verificando credenciales..." +response=$(curl -s -u "$GITEA_USER:$GITEA_TOKEN" https://gitea.espaciomemoria.ar/api/v1/user) + +if echo "$response" | grep -q '"login":"'"$GITEA_USER"'"'; then + echo "✅ Credenciales válidas." + echo "GITEA_USER=$GITEA_USER" > "$HOME/.scripts/.env" + echo "GITEA_TOKEN=$GITEA_TOKEN" >> "$HOME/.scripts/.env" + chmod 600 "$HOME/.scripts/.env" +else + echo "❌ Credenciales inválidas. Abortando instalación." + sudo rm -f /usr/local/bin/git-subir + rm -rf "$HOME/.scripts/git-subir.sh" exit 1 fi -BRANCH="main" - -# ╔════════════════════════════════════════════════════╗ -# ║ INGRESO DE CREDENCIALES ║ -# ╚════════════════════════════════════════════════════╝ - -echo "" -echo "🔐 Ingresá tu usuario de Gitea:" -echo "╔════════════════╗" -read -p "║ Usuario: " USER -echo "╚════════════════╝" - -echo "" -echo "🔐 Ingresá tu contraseña o token de Gitea:" -echo "╔════════════════════════════════╗" -read -s -p "║ Contraseña/Token: " TOKEN -echo "" -echo "╚════════════════════════════════╝" - -# ╔════════════════════════════════════════════════════╗ -# ║ DETECCIÓN DE CAMBIOS SIN COMMITEAR ║ -# ╚════════════════════════════════════════════════════╝ - -CHANGES=$(git status --porcelain) - -if [ -n "$CHANGES" ]; then - echo "" - echo "📦 Se detectaron cambios sin commitear:" - echo "$CHANGES" - read -p "¿Querés hacer commit automático de estos cambios? (s/n): " COMMIT_RESP - - if [ "$COMMIT_RESP" == "s" ]; then - echo "" - read -p "📝 Ingresá el mensaje de commit: " COMMIT_MSG - git add . - git commit -m "$COMMIT_MSG" - echo "✅ Commit realizado." - else - echo "🛑 No se hizo commit. Continuando sin cambios." - fi -fi - -# ╔════════════════════════════════════════════════════╗ -# ║ INICIO DE SUBIDA DE ARCHIVOS ║ -# ╚════════════════════════════════════════════════════╝ - -echo "" -echo "🚀 Subiendo archivos al repositorio remoto..." -echo "" - -REPO_URL=$(git config --get remote.origin.url) - -git config --global credential.helper store -echo "${REPO_URL/https:\/\//https://$USER:$TOKEN@}" > ~/.git-credentials - -git push origin $BRANCH -if [ $? -ne 0 ]; then - echo "" - echo "⚠️ Push fallido. Intentando pull con --allow-unrelated-histories..." - git pull --no-rebase origin $BRANCH --allow-unrelated-histories - - if [ $? -eq 0 ]; then - echo "" - echo "✅ Pull exitoso. Reintentando push..." - git push origin $BRANCH - else - echo "" - echo "⚠️ Verificando conflictos..." - CONFLICTS=$(git diff --name-only --diff-filter=U) - - if [ -n "$CONFLICTS" ]; then - echo "" - echo "🚨 Conflictos detectados:" - echo "$CONFLICTS" - read -p "¿Hacer merge automático? (s/n): " RESP - if [ "$RESP" == "s" ]; then - git add . - git commit -m "🔀 Merge automático" - git push origin $BRANCH - echo "🎉 Push completado después del merge." - else - echo "🛑 Merge cancelado. Resolvé manualmente." - fi - else - echo "❌ Pull falló por otro motivo." - fi - fi -fi +echo "✅ Instalación completa. Usá el comando: git subir"