trạng thái git 2.0

Bất cứ ai là người đầu tiên vào buổi sáng git status Bất cứ ai vừa gõ vừa uống cà phê sẽ yêu thích công cụ hỗ trợ nhỏ bé này. Đặc biệt khi phát triển nhiều dự án web song song, một cái nhìn tổng quan gọn gàng là vô cùng hữu ích: Cây công việc nào sạch sẽ, những thay đổi nào chưa được hợp nhất, và những thay đổi nào đang chờ kéo/đẩy? Một công cụ shell nhỏ gọn là tất cả những gì bạn cần - miễn là nó xử lý khoảng trắng/Unicode trong đường dẫn một cách mạnh mẽ và không gây khó khăn cho các remote bị kẹt.


#!/usr/bin/env bash

set -Eeuo pipefail
export LC_ALL=C

# Check if a command exists (no output).
have() { command -v "$1" >/dev/null 2>&1; }

# Ensure we have a `sort` that supports -z (NUL-delimited) input.
SORT_BIN="sort"
if ! "$SORT_BIN" -z </dev/null 2>/dev/null; then
  if have gsort && gsort -z </dev/null 2>/dev/null; then
    SORT_BIN="gsort"
  else
    printf 'Error: This script requires "sort -z" (GNU coreutils). Install coreutils (gsort).\n' >&2
    exit 1
  fi
fi

# Use GNU `timeout` if available; otherwise try `gtimeout` (macOS); otherwise no timeout.
TIMEOUT_BIN="timeout"
if ! have "$TIMEOUT_BIN"; then
  if have gtimeout; then
    TIMEOUT_BIN="gtimeout"
  else
    TIMEOUT_BIN=""
  fi
fi

# Require git.
if ! have git; then
  printf 'Error: "git" not found.\n' >&2
  exit 1
fi

# Remove a leading "./" from a path for cleaner output.
trim_dot_slash() {
  case "$1" in
    ./*) printf '%s\n' "${1#./}" ;;
    *)   printf '%s\n' "$1" ;;
  esac
}

# Legend + divider (as requested)
printf '\n🟢: clean\n🟡: behind/ahead\n🔴: modified\n\n----------------------------------\n\n'

# Find all .git directories, NUL-delimited; sort NUL-delimited; iterate safely.
find . -type d -name .git -print0 \
| "$SORT_BIN" -z \
| while IFS= read -r -d '' gitdir; do
    repo="${gitdir%/.git}"
    display_path="$(trim_dot_slash "$repo")"

    # Skip anything that isn't a proper work tree (safety check).
    if ! git -C "$repo" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
      continue
    fi

    # Working tree status; include untracked files for a strict "red" signal.
    status_out="$(git -C "$repo" status --porcelain=v1 || true)"

    # Upstream divergence check (only if an upstream is configured).
    ahead=0
    behind=0
    if git -C "$repo" rev-parse --abbrev-ref --symbolic-full-name '@{u}' >/dev/null 2>&1; then
      # Refresh refs; protect with timeout so a hanging remote doesn't stall the loop.
      if [ -n "$TIMEOUT_BIN" ]; then
        "$TIMEOUT_BIN" 10s git -C "$repo" fetch --all --prune >/dev/null 2>&1 || true
      else
        git -C "$repo" fetch --all --prune >/dev/null 2>&1 || true
      fi
      # Count commits only on our side (ahead) and only on upstream's side (behind).
      ahead="$(git  -C "$repo" rev-list --count --left-only  HEAD...@{u} 2>/dev/null || echo 0)"
      behind="$(git -C "$repo" rev-list --count --right-only HEAD...@{u} 2>/dev/null || echo 0)"
    fi

    # Decide the signal:
    # - RED if the working tree isn't clean
    # - YELLOW if clean but ahead/behind of upstream
    # - GREEN otherwise
    if [ -n "$status_out" ]; then
      printf '🔴 %s\n' "$display_path"
    else
      if [ "${ahead:-0}" -gt 0 ] || [ "${behind:-0}" -gt 0 ]; then
        printf '🟡 %s\n' "$display_path"
      else
        printf '🟢 %s\n' "$display_path"
      fi
    fi
  done

Kịch bản vẫn cần phải... chmod +x ~/path/to/script.sh làm cho nó có thể thực thi và có thể thiết lập một bí danh để lưu các lần nhập có giá trị: Ở đây bạn thêm vào ~/.bashrc / ~/.zshrc / ~/.bash_profile lối vào alias gscan='bash /path/to/script.sh' ngoài ra. Từ đó trở đi, một cách đơn giản gscan trong thư mục gốc mong muốn.

Một lý do tại sao lần chạy thứ hai nhanh hơn đáng kể: Trong lần chạy đầu tiên, hệ thống tệp vẫn phải quét mọi thứ; sau đó, siêu dữ liệu và nhiều thứ khác đã được xử lý. .git-Các cấu trúc đã được đưa vào bộ nhớ đệm trang của nhân hệ điều hành, và các tham chiếu và biểu đồ cam kết đã được khởi động. Bước tiếp theo... fetch Giờ đây, nó chủ yếu chỉ truyền các delta nhỏ. Không cần bảng điều khiển, không cần chi phí quản lý - chỉ cần chụp nhanh trạng thái trực tiếp trên thiết bị đầu cuối.

Trở lại