- bin/git-check-all.sh: Status aller Git-Repos prüfen (alias gitcheck) - bin/git-update-all.sh: Alle Git-Repos pullen (alias gitupdate) - .p10k.zsh: Powerlevel10k-Konfiguration für einheitliches Terminal-Setup
106 lines
2.7 KiB
Bash
Executable file
106 lines
2.7 KiB
Bash
Executable file
#!/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 <<EOF
|
|
Usage: ${0##*/} [OPTIONEN]
|
|
|
|
Synchronisiert alle Git-Repositories (git pull).
|
|
Repos mit lokalen Aenderungen werden uebersprungen.
|
|
|
|
Optionen:
|
|
-p, --path DIR anderes Basisverzeichnis statt ~/git-projekte
|
|
-h, --help diese Hilfe anzeigen
|
|
EOF
|
|
exit 0
|
|
;;
|
|
*) echo "Unbekannte Option: $1" >&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"
|