8f45b40528
12 funciones Bash del dominio shell: utilidades de scripting (bash_log, bash_colors, bash_check_deps, bash_confirm, bash_handle_error, bash_safe_run), manipulacion de texto (convert_text_case), estructura de proyectos (create_project_structure), y operaciones git (git_clean_branches, git_log_visual, git_push_all_remotes, git_repo_status). Cada una con su .sh y .md de frontmatter.
96 lines
2.7 KiB
Bash
96 lines
2.7 KiB
Bash
#!/usr/bin/env bash
|
|
# git_repo_status
|
|
# ---------------
|
|
# Muestra el estado completo de un repositorio Git: rama actual, upstream,
|
|
# cambios pendientes, stash, remotes y últimos commits.
|
|
# Sale con exit code 1 si el directorio actual no es un repositorio Git.
|
|
#
|
|
# USO:
|
|
# source git_repo_status.sh
|
|
# git_repo_status
|
|
#
|
|
# O como script directo:
|
|
# bash git_repo_status.sh
|
|
|
|
git_repo_status() {
|
|
if ! git rev-parse --is-inside-work-tree &>/dev/null; then
|
|
echo "git_repo_status: el directorio actual no es un repositorio Git" >&2
|
|
return 1
|
|
fi
|
|
|
|
local branch
|
|
branch="$(git rev-parse --abbrev-ref HEAD 2>/dev/null)"
|
|
|
|
# Upstream
|
|
local upstream
|
|
upstream="$(git rev-parse --abbrev-ref "${branch}@{upstream}" 2>/dev/null || echo "")"
|
|
local upstream_info
|
|
if [[ -z "$upstream" ]]; then
|
|
upstream_info="sin upstream"
|
|
else
|
|
local ahead behind
|
|
ahead="$(git rev-list "${upstream}..HEAD" --count 2>/dev/null || echo 0)"
|
|
behind="$(git rev-list "HEAD..${upstream}" --count 2>/dev/null || echo 0)"
|
|
upstream_info="↑${ahead} ↓${behind} (${upstream})"
|
|
fi
|
|
|
|
echo "=== Rama & Upstream ==="
|
|
echo " Rama actual: ${branch}"
|
|
echo " Upstream: ${upstream_info}"
|
|
echo ""
|
|
|
|
# Cambios
|
|
echo "=== Cambios ==="
|
|
local changes
|
|
changes="$(git status --short 2>/dev/null)"
|
|
if [[ -z "$changes" ]]; then
|
|
echo " Directorio de trabajo limpio"
|
|
else
|
|
echo " Cambios pendientes:"
|
|
echo "$changes" | while IFS= read -r line; do
|
|
echo " ${line}"
|
|
done
|
|
fi
|
|
echo ""
|
|
|
|
# Stash
|
|
echo "=== Stash ==="
|
|
local stash_count
|
|
stash_count="$(git stash list 2>/dev/null | wc -l | tr -d ' ')"
|
|
if [[ "$stash_count" -eq 0 ]]; then
|
|
echo " Sin entradas en stash"
|
|
else
|
|
echo " ${stash_count} entrada(s) en stash:"
|
|
git stash list | head -5 | while IFS= read -r line; do
|
|
echo " ${line}"
|
|
done
|
|
fi
|
|
echo ""
|
|
|
|
# Remotes
|
|
echo "=== Remotes ==="
|
|
local remotes
|
|
remotes="$(git remote -v 2>/dev/null | grep '(fetch)' || true)"
|
|
if [[ -z "$remotes" ]]; then
|
|
echo " Sin remotes configurados"
|
|
else
|
|
echo "$remotes" | while IFS= read -r line; do
|
|
local name url
|
|
name="$(echo "$line" | awk '{print $1}')"
|
|
url="$(echo "$line" | awk '{print $2}')"
|
|
echo " ${name} → ${url}"
|
|
done
|
|
fi
|
|
echo ""
|
|
|
|
# Últimos commits
|
|
echo "=== Últimos commits ==="
|
|
git log --oneline --decorate --color=always -8 2>/dev/null || true
|
|
echo ""
|
|
}
|
|
|
|
# Ejecutar si se invoca directamente
|
|
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
|
git_repo_status "$@"
|
|
fi
|