Script para revisar repositorios con cambios pendientes

Publicado: 2020-11-08

Cada uno de mis proyectos de escritura está versionado en Bitbucket, en un repositorio privado.

Y todo proyecto de escritura está almacenado en mi carpeta de usuario, en un directorio llamado “Escritura” (i.e. ~/Escritura)… el problema es que tengo al menos tres computadoras en las que trabajo, según mis circunstancias.

Algunas veces olvido hacer el commit en una y ya me da flojera trabajar sobre lo mismo en otro dispositivo, sabiendo que tendré que lidiar con el merge o recordar en qué me había quedado.

Como tengo varios repositorios (léase “proyectos”) y mi mente trabaja de manera desorganizada, algunas veces trabajo en un proyecto y ni recuerdo.

Tomando en cuenta mis fallas de memoria, considero mejor dejarle el trabajo a la computadora: automatizar la revisión de todos los proyectos, para saber cuáles tienen cambios pendientes.

Para ello, cree un script de bash para revisar todos los directorios en mi carpeta de proyectos.

En sí, lo que hace es iterar revisando cada directorio utilizando la instrucción git status --porcelain. Esta instrucción permite ver solo los archivos cambiados, sin toda la explicación que da sin el parámetro --porcelain.

Puedes ver y expandir el script completo, colocado aquí debajo:

#!/bin/bash

# Ideas tomadas de:
#   https://stackoverflow.com/a/4000707
#     Para la lógica del ciclo por los directorios.
#   https://stackoverflow.com/a/5139346
#     Para la lógica de revisar el git status para determinar acción.
#   https://stackoverflow.com/questions/3005963/how-can-i-have-a-newline-in-a-string-in-sh
#     Para darme cuenta que echo no se lleva bien con los \n.

proyectosSinCambios=""
# Por cada directorio dentro de mi carpeta de trabajo.
for D in `find . -mindepth 1 -maxdepth 1 -type d`
do
    # Si no es un directorio, pasamos al siguiente elemento.
    if [ ! -d "${D}" ]; then
        continue
    fi

    # Nos cambiamos al directorio del proyecto para las operaciones.
    cd $D

    # Revisamos si hay cambios pendientes de versionar.
    if [ -z "$(git status --porcelain)" ]; then
        # Si no hubo cambios, guardamos el nombre para imprimir después.
        proyectosSinCambios="\t$D\n$proyectosSinCambios"
        # Y regresamos, muy importante.
        cd ..
        continue
    fi

    # Las operaciones que sean necesarias.
    echo "*******************************************************"
    echo "*** Cambios pendientes para $D..."
    echo "*******************************************************"
    git status --porcelain
    echo "*******************************************************"
    echo ""
    echo ""

    # Regresamos
    cd ..
done

echo "Los siguientes proyectos no tienen cambios pendientes:"
printf $proyectosSinCambios

Por lo tanto, los proyectos sin cambios solo se almacenan en una variable para ser impresa al final, mientras que los proyectos con cambios muestran de manera sucinta lo que falta de versionar.

Aquí se puede ver un ejemplo de dicha salida, tras evaluar los cambios de mis seis proyectos:

$ ./revisar.sh
*******************************************************
*** Cambios pendientes para ./libro-kanban...
*******************************************************
A  .gitignore
M  README.md
M  "ch_dise\303\261o.md"
M  ch_intro.md
AM ch_kanban.md
MM ch_reglas.md
A  libro_kanban.sublime-project
AM mi_kanban.md
A  referencias.md
?? ch_fisico.md
*******************************************************


*******************************************************
*** Cambios pendientes para ./ramoscarlos_blog...
*******************************************************
?? Ideas por publicar/Mi proceso de escritura.html
*******************************************************


Los siguientes proyectos no tienen cambios pendientes:
        ./udemy-sublime-2
        ./udemy-gdb
        ./libro-sublime
        ./e37_progreso

Y eso es todo. Ahora tengo un script para ejecutar antes de dejar el equipo en el que esté trabajando, para revisar si hay cosas pendientes.

Ya después veré si agrego un add, commit, y push automático…

De momento, puedes tomar y adaptar este script como creas conveniente.

Total, muchas ideas las tomé de StackOverflow ;).

¿Tienes algún comentario?

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *