Mostrar rama y estado de Git en el prompt de Bash

Personalización del prompt de Bash para contexto de Git instantáneo

Índice

Una configuración bien hecha del prompt de bash que muestra información del repositorio git puede mejorar drásticamente tu flujo de trabajo de desarrollo.

En lugar de ejecutar constantemente los comandos git status y git branch, puedes tener esta información crítica siempre visible en tu terminal.

oh-my-posh

Ejemplo de prompt de oh-my-posh.

¿Por qué agregar información de git a tu prompt de bash?

Cuando trabajas con múltiples repositorios de git y ramas durante el día, el cambio de contexto se convierte en una gran pérdida de productividad. Un prompt consciente de git resuelve varios problemas comunes:

  • Evita la confusión de ramas: Siempre sabrás en qué rama estás antes de hacer un commit
  • Reduce la sobrecarga de comandos: No es necesario ejecutar constantemente git status y git branch
  • Retroalimentación visual inmediata: Mira los cambios no comprometidos, archivos no rastreados y el estado de la rama remota a simple vista
  • Menos errores: Evita accidentalmente hacer un commit en la rama incorrecta o empujar código sucio

Entendiendo la variable PS1 de bash

El prompt de bash está controlado por la variable de entorno PS1. Esta variable puede contener:

  • Texto literal: Cualquier carácter que desees mostrar
  • Secuencias de escape: Códigos especiales que comienzan con \ que muestran información dinámica
  • Sustitución de comandos: Comandos en $(...) que se ejecutan y muestran su salida
  • Códigos de color ANSI: Secuencias de escape que cambian los colores del texto

Secuencias de escape PS1 comunes incluyen:

  • \u - nombre de usuario actual
  • \h - nombre del host
  • \w - directorio de trabajo actual
  • \$ - # para el usuario root, $ para el usuario normal
  • \t - hora actual en formato de 24 horas

Un prompt básico podría verse así: PS1='\u@\h:\w\$ ' produciendo una salida como user@hostname:/path/to/dir$ . Para más fundamentos de bash y secuencias de escape, consulta nuestro Hoja de referencia de Bash.

Método 1: Usando el script git-prompt.sh integrado de git

Las distribuciones de git incluyen un script de ayuda llamado git-prompt.sh que proporciona la función __git_ps1. Este es el enfoque más confiable y con más características.

Localizando git-prompt.sh

Primero, encuentra donde se encuentra el script en tu sistema:

# Ubicaciones comunes en Linux
/usr/share/git-core/contrib/completion/git-prompt.sh
/etc/bash_completion.d/git-prompt
/usr/lib/git-core/git-sh-prompt

# Ubicaciones comunes en macOS (con Homebrew)
/usr/local/etc/bash_completion.d/git-prompt.sh
/Library/Developer/CommandLineTools/usr/share/git-core/git-prompt.sh

# Busca si es necesario
find /usr -name git-prompt.sh 2>/dev/null

Configuración básica

Agrega lo siguiente a tu ~/.bashrc o ~/.bash_profile:

# Fuente el script git-prompt
source /usr/lib/git-core/git-sh-prompt

# Establece tu prompt para incluir información de git
PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\[\033[01;31m\]$(__git_ps1 " (%s)")\[\033[00m\]\$ '

La parte $(__git_ps1 " (%s)") llama a la función, y %s se reemplaza con el nombre de la rama actual. Los espacios y paréntesis que rodean la función lo formatean bien.

Después de editar, recarga tu configuración:

source ~/.bashrc

Opciones avanzadas de git-prompt.sh

git-prompt.sh se vuelve poderoso cuando habilitas sus características opcionales a través de variables de entorno:

# Muestra cambios no comprometidos (*) y comprometidos (+)
export GIT_PS1_SHOWDIRTYSTATE=1

# Muestra si hay cambios en la pila ($)
export GIT_PS1_SHOWSTASHSTATE=1

# Muestra si hay archivos no rastreados (%)
export GIT_PS1_SHOWUNTRACKEDFILES=1

# Muestra la diferencia entre HEAD y la rama remota
# Opciones: auto, verbose, name, legacy, git, svn
export GIT_PS1_SHOWUPSTREAM="auto"

# Habilita sugerencias de color (requiere bash 4.0+)
export GIT_PS1_SHOWCOLORHINTS=1

# Muestra el estado del repositorio durante las operaciones
# (MERGING, REBASING, BISECTING, etc.)
export GIT_PS1_DESCRIBE_STYLE="default"

Aquí está lo que significan los indicadores:

  • * - Cambios no comprometidos (archivos modificados pero no añadidos)
  • + - Cambios comprometidos (archivos añadidos pero no comprometidos)
  • $ - Existen cambios en la pila
  • % - Hay archivos no rastreados
  • < - Está atrás de la rama remota
  • > - Está delante de la rama remota
  • <> - Divergida de la rama remota
  • = - Igual a la rama remota

Configuración completa de ejemplo

Aquí hay una configuración completa de ~/.bashrc:

# Fuente git-prompt
if [ -f /usr/share/git-core/contrib/completion/git-prompt.sh ]; then
    source /usr/share/git-core/contrib/completion/git-prompt.sh
fi

# Configura las opciones de git-prompt
export GIT_PS1_SHOWDIRTYSTATE=1
export GIT_PS1_SHOWSTASHSTATE=1
export GIT_PS1_SHOWUNTRACKEDFILES=1
export GIT_PS1_SHOWUPSTREAM="auto"
export GIT_PS1_SHOWCOLORHINTS=1

# Definiciones de color
COLOR_RESET='\[\033[00m\]'
COLOR_USER='\[\033[01;32m\]'      # Verde
COLOR_PATH='\[\033[01;34m\]'      # Azul
COLOR_GIT='\[\033[01;33m\]'       # Amarillo

# Establece el prompt
PS1="${COLOR_USER}\u@\h${COLOR_RESET}:${COLOR_PATH}\w${COLOR_GIT}"'$(__git_ps1 " (%s)")'"${COLOR_RESET}\$ "

Método 2: Sustitución manual de comandos de git

Si no tienes acceso a git-prompt.sh o quieres una solución mínima, puedes ejecutar directamente comandos de git en tu prompt:

# Solo el nombre de la rama
PS1='\u@\h:\w$(git branch 2>/dev/null | grep "^*" | colrm 1 2 | sed "s/^/ (/;s/$/)/")\$ '

# Nombre de la rama con indicador de estado
parse_git_dirty() {
    [[ $(git status 2> /dev/null | tail -n1) != "nothing to commit, working tree clean" ]] && echo "*"
}

parse_git_branch() {
    git branch 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/ (\1$(parse_git_dirty))/"
}

PS1='\u@\h:\w\[\033[01;33m\]$(parse_git_branch)\[\033[00m\]\$ '

Este enfoque es más portátil pero carece de la sofisticación de git-prompt.sh y puede ser más lento en repositorios grandes.

Método 3: Herramientas modernas de prompt

Para una experiencia más rica con una configuración mínima, considera estos alternativas modernas:

Starship Prompt

Starship es un prompt rápido y personalizable escrito en Rust que funciona en múltiples shells (bash, zsh, fish, PowerShell).

# Instalar Starship
curl -sS https://starship.rs/install.sh | sh

# Añadir a ~/.bashrc
eval "$(starship init bash)"

Starship detecta automáticamente los repositorios de git y muestra:

  • Nombre de la rama
  • Hash de commit cuando se está desconectado
  • Estado del repositorio (merge, rebase, etc.)
  • Cantidad de archivos modificados
  • Estado de adelante/atrás de la rama remota
  • Y mucho más con iconos personalizables

Configúralo mediante ~/.config/starship.toml:

[git_branch]
symbol = "🌱 "
format = "on [$symbol$branch]($style) "

[git_status]
conflicted = "🏳"
ahead = "⇡${count}"
behind = "⇣${count}"
diverged = "⇕⇡${ahead_count}⇣${behind_count}"
untracked = "🤷"
stashed = "📦"
modified = "📝"
staged = '[++\($count\)](green)'
renamed = "👅"
deleted = "🗑"

Oh My Bash

Oh My Bash es un marco para administrar la configuración de bash con temas y plugins:

# Instalar Oh My Bash
bash -c "$(curl -fsSL https://raw.githubusercontent.com/ohmybash/oh-my-bash/master/tools/install.sh)"

# Editar ~/.bashrc para establecer el tema
OSH_THEME="powerline"

Muchos temas de Oh My Bash incluyen integración de git por defecto.

Oh My Posh

Oh My Posh es un motor moderno, multiplataforma de prompt que funciona con bash, zsh, PowerShell y otras shells. Proporciona prompts hermosos y personalizables con excelente integración de git y usa Nerd Fonts para el soporte de iconos.

Instalación en Linux

Instala Oh My Posh con un solo comando:

# Instala en ~/bin o ~/.local/bin (predeterminado)
curl -s https://ohmyposh.dev/install.sh | bash -s

# O especifica un directorio de instalación personalizado
curl -s https://ohmyposh.dev/install.sh | bash -s -- -d ~/bin

Configuración básica

Agrega Oh My Posh a tu ~/.bashrc:

# Inicializa Oh My Posh con un tema
eval "$(oh-my-posh init bash --config ~/.poshthemes/jandedobbeleer.omp.json)"

Instalación y uso de temas

Oh My Posh incluye numerosos temas prehechos. Descárgalos primero:

# Crea el directorio de temas
mkdir ~/.poshthemes

# Descarga todos los temas
curl -s https://ohmyposh.dev/themes.json | \
  jq -r '.[] | .url' | \
  xargs -I {} sh -c 'curl -s {} -o ~/.poshthemes/$(basename {})'

Temas populares incluyen:

  • jandedobbeleer.omp.json - El tema personal del creador con integración completa de git
  • powerline.omp.json - Estilo clásico de powerline
  • atomic.omp.json - Minimalista con información esencial
  • night-owl.omp.json - Tema colorido con detalles extensos de git

Cambia de tema modificando la ruta de la configuración:

eval "$(oh-my-posh init bash --config ~/.poshthemes/atomic.omp.json)"

Características de git

Oh My Posh muestra automáticamente información completa de git:

  • Nombre de la rama actual
  • Cantidad de commits adelante/atrás de la rama remota
  • Estado del directorio de trabajo (limpio/sucio)
  • Cantidad de cambios en la pila
  • Estado de merge/rebase
  • Información de etiquetas
  • Hash de commit en estado de HEAD desconectado

Configuración personalizada

Crea un tema personalizado copiando uno existente:

# Copia un tema como punto de partida
cp ~/.poshthemes/jandedobbeleer.omp.json ~/.mytheme.omp.json

# Edita tu tema
nano ~/.mytheme.omp.json

# Usa tu tema personalizado
eval "$(oh-my-posh init bash --config ~/.mytheme.omp.json)"

Ejemplo de configuración de segmento de git en JSON:

{
  "type": "git",
  "style": "powerline",
  "powerline_symbol": "",
  "foreground": "#193549",
  "background": "#fffb38",
  "background_templates": [
    "{{ if or (.Working.Changed) (.Staging.Changed) }}#FF9248{{ end }}",
    "{{ if and (gt .Ahead 0) (gt .Behind 0) }}#ff4500{{ end }}",
    "{{ if gt .Ahead 0 }}#B388FF{{ end }}",
    "{{ if gt .Behind 0 }}#B388FF{{ end }}"
  ],
  "properties": {
    "fetch_status": true,
    "fetch_upstream_icon": true,
    "branch_icon": " ",
    "branch_max_length": 25,
    "truncate_symbol": "…"
  }
}

Requisitos de fuentes

Oh My Posh funciona mejor con Nerd Fonts para el soporte de iconos:

# Descarga e instala una fuente de Nerd (ejemplo: FiraCode)
mkdir -p ~/.local/share/fonts
cd ~/.local/share/fonts
curl -fLo "FiraCode Nerd Font.ttf" \
  https://github.com/ryanoasis/nerd-fonts/raw/HEAD/patched-fonts/FiraCode/Regular/FiraCodeNerdFont-Regular.ttf
fc-cache -fv

Luego configura tu terminal para usar la fuente de Nerd.

Ventajas de Oh My Posh

  • Multiplataforma: La misma configuración funciona en Linux, macOS y Windows
  • Rápido: Escrito en Go para un mejor rendimiento
  • Extensible: Segmentos modulares para git, hora, ruta, idiomas, proveedores de nube, etc.
  • Temas ricos: Gran colección de temas prehechos
  • Desarrollo activo: Actualizaciones y mejoras regulares
  • Agnóstico de terminal: Funciona en cualquier terminal compatible con ANSI

Bash-git-prompt

Una herramienta dedicada de prompt de bash enfocada en información de git:

# Clona el repositorio
git clone https://github.com/magicmonty/bash-git-prompt.git ~/.bash-git-prompt --depth=1

# Añade a ~/.bashrc
if [ -f "$HOME/.bash-git-prompt/gitprompt.sh" ]; then
    GIT_PROMPT_ONLY_IN_REPO=1
    source $HOME/.bash-git-prompt/gitprompt.sh
fi

Consideraciones de rendimiento en repositorios grandes

Las operaciones de estado de git pueden ser lentas en repositorios grandes. Aquí hay estrategias de optimización:

Deshabilitar características costosas de forma selectiva

# En .bashrc, deshabilita características selectivamente para repositorios grandes
if [ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]; then
    repo_size=$(du -sh .git 2>/dev/null | cut -f1)
    # Deshabilita verificación de estado sucio para repositorios mayores de 100MB
    if [[ "$repo_size" =~ ^[0-9]+M$ ]] && [ "${repo_size%M}" -gt 100 ]; then
        export GIT_PS1_SHOWDIRTYSTATE=0
    fi
fi

Usar opciones de configuración de git

Configura git para optimizar las verificaciones de estado:

# Habilita monitor de sistema de archivos para verificaciones de estado más rápidas
git config core.fsmonitor true
git config core.untrackedCache true

# Para repositorios muy grandes, considera clones parciales
git config core.commitGraph true
git config gc.writeCommitGraph true

Alternativa: Prompts asincrónicos

Herramientas como Starship usan operaciones asincrónicas para evitar el retraso en el prompt. El prompt se actualiza después de que se recupere la información de git, en lugar de bloquear.

Solución de problemas comunes

El prompt no muestra información de git

  1. Verifica que git-prompt.sh esté fuenteado: Ejecuta type __git_ps1 en tu terminal. Si dice “no encontrado”, el script no está cargado.
  2. Verifica los permisos del archivo: Asegúrate de que git-prompt.sh sea legible: ls -l /ruta/a/git-prompt.sh
  3. Verifica que estés en un repositorio de git: Ejecuta git status para confirmar
  4. Verifica la sintaxis de PS1: Asegúrate de que $(__git_ps1) esté incluido y correctamente citado

Los colores no se muestran

  1. Problemas con secuencias de escape: Los colores en PS1 deben estar envueltos en \[ \] para evitar problemas de ajuste de línea
  2. Soporte de terminal: Verifica que tu terminal soporte colores ANSI: echo -e "\033[31mTexto rojo\033[0m"
  3. Códigos de reinicio: Siempre termina las secuencias de color con el código de reinicio \033[00m

El prompt rompe el ajuste de línea

Cuando usas colores, las secuencias de escape no imprimibles deben estar envueltas en \[ y \]:

# Incorrecto - causa problemas de ajuste de línea
PS1="\033[32m\u\033[00m\$ "

# Correcto
PS1="\[\033[32m\]\u\[\033[00m\]\$ "

Prompt lento en WSL o discos de red

Las operaciones de git en discos de red de Windows o WSL pueden ser lentas:

# Deshabilita características costosas de git-prompt en sistemas de archivos lentos
export GIT_PS1_SHOWDIRTYSTATE=0
export GIT_PS1_SHOWUNTRACKEDFILES=0

Considera usar el bash nativo de Windows en lugar de WSL para repositorios en discos de Windows.

Integración con flujos de trabajo de desarrollo

Un prompt consciente de git se vuelve aún más poderoso cuando se combina con otras mejoras de shell:

Aliases de git para navegación rápida

Combina tu prompt mejorado con alias útiles de git para maximizar la eficiencia. Para una lista completa de comandos y atajos de git, consulta nuestra Hoja de referencia de comandos de git.

# Añade a ~/.gitconfig o ~/.bashrc
alias gs='git status'
alias gb='git branch'
alias gc='git checkout'
alias gp='git pull'
alias gpu='git push'

Comportamiento del prompt condicional

# Colores del prompt condicionales según el estado
__git_ps1_colorize() {
    local git_status="$(git status 2>/dev/null)"
    if [[ $git_status =~ "nothing to commit" ]]; then
        echo -e "\[\033[32m\]"  # Verde para limpio
    else
        echo -e "\[\03键[31m\]"  # Rojo para sucio
    fi
}

PS1='\u@\h:\w$(__git_ps1_colorize)$(__git_ps1 " (%s)")\[\033[00m\]\$ '

Integración con la barra de título del terminal

Actualiza el título del terminal con información del repositorio:

PROMPT_COMMAND='echo -ne "\033]0;${PWD##*/}$(__git_ps1 " [%s]")\007"'

Mejores prácticas y recomendaciones

  1. Mantén la legibilidad: No sobrecargues tu prompt con demasiada información
  2. Usa colores estratégicamente: Diferentes colores para diferentes estados (limpio vs sucio)
  3. Prueba en múltiples escenarios: Verifica que el prompt funcione en directorios normales, repositorios de git y durante operaciones de git
  4. Documenta tu configuración: Comenta tu .bashrc para que recuerdes qué hace cada parte
  5. Haz copias de seguridad de tu configuración: Controla versiones de tus dotfiles en un repositorio de git. Si estás ejecutando tu propio servidor de git, podrías querer explorar Instalación de Gitea como una opción ligera de servidor autohospedado
  6. Considera tu flujo de trabajo: Activa solo las características que realmente necesitas
  7. Usa herramientas modernas cuando sea posible: Starship y herramientas similares están bien probadas y son performantes

Para soluciones autohospedadas de git, aprende sobre Copia de seguridad y restauración de Gitea para asegurar que tus repositorios estén protegidos. Si estás interesado en automatizar tus flujos de trabajo de git, explora nuestra Hoja de referencia de GitHub Actions para una automatización completa de CI/CD.

Enlaces útiles

Otros artículos útiles