Crear tu propio comando de git: git my-command

Crear tu propio comando de git: git my-command

Introducción

Soy de las personas que siempre ando buscando "hacks" para simplificar mi trabajo y eliminar tareas repetitivas, si eres como yo, espero que este tutorial te ayude en tu día a día.

Git Aliases

Antes de entrar en suelo de los git commands, es importante que entendamos que la mayor parte de necesidades se pueden solucionar utilizando git aliases por ejemplo dentro de mi .gitconfig tengo el siguiente alias:

lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

Lo que me permite es generar una salida de parecida a esta:

image.png

Git Commands

Existen ciertas tareas que se tornan más complejas y que resulta ser mejor crear un comando en lugar de un alias.

La forma de trabajar de git es que cada vez que ejecutas git commit a su vez ejecuta un archivo binario o script llamado git-commit; si ejecutas git branch este a su vez ejecuta el archivo con nombre git-branch.

¿Dónde están ubicados todos estos archivos?

Si deseas visualizar donde se almacenan estos archivos debes de ejecutar en tu terminal:

cd $(git --exec-path) && ls

Obtendrás algo parecido a esto: image.png

Creando nuestro propio comando

Vamos a crear un comando que nos permita renombrar una branch local y remota. Es posible que exista una mejor forma de hacerlo, pero a manera didáctica usaremos este caso como ejemplo para construir nuestro script.

Paso 1: Crear los pasos a ejecutarse en el script

Los pasos que nuestro script deberá seguir, son:

  1. Crear una nueva branch a partir de la branch actual y que utilice el nuevo nombre.
  2. Publicar la nueva branch en el remoto.
  3. Eliminar la branch actual en el remoto.
  4. Eliminar la branch actual en el local.

Paso 2: Creando el archivo

El nombre de nuestro archivo deberá tener la siguiente nomenclatura git-nombre-de-mi-comando, por lo que utilizaré git-rename para que pueda ejecutar git rename branch_nueva.

Paso 3: reando un menú de ayuda sobre el comando.

#!/bin/sh
# File: git-rename

USAGE='[help]'
LONG_USAGE='git rename help
    Muestra el mensaje de ayuda
git rename nombre_nuevo
    Elimina la branch actual y crea una nueva apartir de la misma en local y remoto.'

OPTIONS_SPEC=
. git-sh-setup # Documentación https://git-scm.com/docs/git-sh-setup

El scriptlet git sh-setup está diseñado para ser obtenido (usando .) por otros scripts de shell para configurar algunas variables que apunten a los directorios normales de Git y algunas funciones auxiliares de shell.

Paso 4: Creando la función a invocar

Crearemos la función rename_branch que hace lo siguiente:

  1. Crea una variable currentBranch que tiene como valor el nombre de la branch actual.
  2. Imprime un mensaje de que renombrará la branch por el primer argumento que recibe la función
  3. Ejecuta los pasos que creamos en el paso 1.

    rename_branch () {
     declare currentBranch=$(git symbolic-ref --short HEAD);
    
     echo "Renombrando branch $currentBranch por $1"
    
     git checkout -b $1 && git push --set-upstream origin $1 && git push origin --delete $currentBranch && git branch -D $currentBranch
    
     echo $1;
    }
    

Paso 5: Mostrando mensaje de ayuda o invocando la función

Cada vez que se ejecute este archivo, debemos de capturar el números de argumentos que hemos recibido, en caso no venga ninguno, mostraremos el mensaje de ayuda.

Si viene al menos un argumento, capturaremos el valor y revisaremos si es help para mostrar el mensaje de ayuda, caso contrario invocaremos la función de rename_branch con el valor.

case "$#" in
0)
    usage ;;
*)
    cmd="$1"
      shift
    case "$cmd" in
      help)
        git rename -h ;;
      *)
        rename_branch "$cmd" ;;
    esac
esac

Paso 6: Guardando el archivo

Guarda el archivo en la ruta que obtuviste con git --exec-path y cambiale el permiso para que sea ejecutable con chmod +x ./git-rename

Script final

Este sería el script final:

#!/bin/sh
# File: git-rename

USAGE='[help]'
LONG_USAGE='git rename help
    Muestra el mensaje de ayuda
git rename nombre_nuevo
    Elimina la branch actual y crea una nueva apartir de la misma en local y remoto.'

OPTIONS_SPEC=
. git-sh-setup

rename_branch () {
    declare currentBranch=$(git symbolic-ref --short HEAD);

    echo "Renombrando branch $currentBranch por $1"

    git checkout -b $1 && git push --set-upstream origin $1 && git push origin --delete $currentBranch && git branch -D $currentBranch

    echo $1;
}

case "$#" in
0)
    usage ;;
*)
    cmd="$1"
      shift
    case "$cmd" in
      help)
        git rename -h ;;
      *)
        rename_branch "$cmd" ;;
    esac
esac

Espero que este pequeño tutorial te brinde las posibilidades de automatizar tu día a día.