#!/usr/bin/env bash set -euo pipefail BASE_DIR="$HOME/git-projekte" # --- Farben ------------------------------------------------------------ if [ -t 1 ]; then C_RED=$'\033[31m' C_GREEN=$'\033[32m' C_YELLOW=$'\033[33m' C_BOLD=$'\033[1m' C_RESET=$'\033[0m' else C_RED=""; C_GREEN=""; C_YELLOW=""; C_BOLD=""; C_RESET="" fi # --- Argumente ---------------------------------------------------------- while [[ $# -gt 0 ]]; do case "$1" in -p|--path) BASE_DIR="$2"; shift 2 ;; -h|--help) cat <&2; exit 2 ;; esac done if [ ! -d "$BASE_DIR" ]; then echo "Verzeichnis $BASE_DIR existiert nicht." exit 0 fi echo "${C_BOLD}Git-Repositories aktualisieren: $BASE_DIR${C_RESET}" echo # --- Repos finden und sortieren ----------------------------------------- gitdirs=() while IFS= read -r gitdir; do gitdirs+=( "$gitdir" ) done < <(find "$BASE_DIR" -type d -name ".git" -print 2>/dev/null) if [ ${#gitdirs[@]} -eq 0 ]; then echo "Keine Git-Repositories gefunden." exit 0 fi IFS=$'\n' sorted_gitdirs=( $(printf '%s\n' "${gitdirs[@]}" | sort) ) unset IFS # --- Pull --------------------------------------------------------------- total=0 updated=0 skipped=0 failed=0 for gitdir in "${sorted_gitdirs[@]}"; do repo_dir="${gitdir%/.git}" repo_name="${repo_dir#$BASE_DIR/}" ((total++)) cd "$repo_dir" || continue # Lokale Aenderungen? -> ueberspringen if [[ -n "$(git status --porcelain 2>/dev/null)" ]]; then printf "${C_YELLOW}SKIP${C_RESET} %s (lokale Aenderungen)\n" "$repo_name" ((skipped++)) continue fi # Kein Remote? -> ueberspringen if ! git remote | grep -q .; then printf "${C_YELLOW}SKIP${C_RESET} %s (kein Remote)\n" "$repo_name" ((skipped++)) continue fi # Pull if output=$(git pull --ff-only 2>&1); then if echo "$output" | grep -q "Already up to date"; then printf "${C_GREEN}OK${C_RESET} %s (aktuell)\n" "$repo_name" else printf "${C_GREEN}PULL${C_RESET} %s (aktualisiert)\n" "$repo_name" ((updated++)) fi else printf "${C_RED}FAIL${C_RESET} %s\n" "$repo_name" ((failed++)) fi done # --- Zusammenfassung ---------------------------------------------------- echo echo "${C_BOLD}Gesamt:${C_RESET} $total Repositories" echo "${C_GREEN}Aktualisiert:${C_RESET} $updated" echo "${C_YELLOW}Uebersprungen:${C_RESET} $skipped" echo "${C_RED}Fehlgeschlagen:${C_RESET} $failed"