#!/usr/bin/env bash # git_log_visual # -------------- # Muestra el historial de commits con grafo visual, colores y formato legible. # Soporta filtros por cantidad, autor, fecha y todas las ramas. # # USO: # source git_log_visual.sh # git_log_visual [--count N] [--author X] [--since D] [--all] # # ARGUMENTOS: # --count N NĂºmero de commits a mostrar (default: 20) # --author X Filtrar por nombre o email del autor # --since D Mostrar commits desde fecha (ej: "1 week ago", "2025-01-01") # --all Incluir todas las ramas git_log_visual() { local count=20 local author="" local since="" local all_branches=false # Parsear argumentos while [[ $# -gt 0 ]]; do case "$1" in --count|-n) count="$2" shift 2 ;; --author|-a) author="$2" shift 2 ;; --since|-s) since="$2" shift 2 ;; --all) all_branches=true shift ;; *) shift ;; esac done # Validar repo if ! git rev-parse --is-inside-work-tree &>/dev/null; then echo "git_log_visual: el directorio actual no es un repositorio Git" >&2 return 1 fi local log_format="%C(yellow)%h%C(reset) %C(cyan)%ad%C(reset) %C(green)%an%C(reset) %s%C(red)%d%C(reset)" # Construir argumentos del comando local args=() args+=("--graph") args+=("--color=always") args+=("--date=short") args+=("--format=${log_format}") args+=("-n" "${count}") [[ -n "$author" ]] && args+=("--author=${author}") [[ -n "$since" ]] && args+=("--since=${since}") [[ "$all_branches" == true ]] && args+=("--all") # Ejecutar git log "${args[@]}" 2>/dev/null | less -R --quit-if-one-screen } # Ejecutar si se invoca directamente if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then git_log_visual "$@" fi