Crear tu propio comando de git: git my-command
Published: 2022-02-24 20:04:07

## 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:

```bash
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](https://cdn.hashnode.com/res/hashnode/image/upload/v1645730493288/DDrGJ97cD.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:

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

```

Obtendrás algo parecido a esto: ![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1645730913257/8idbLg3Ca.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.

```bash
#!/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.

### 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.

```bash
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:

```bash
#!/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.