| Server IP : 202.61.199.114 / Your IP : 216.73.217.139 Web Server : nginx/1.22.1 System : Linux de.arni-solutions.de 6.1.0-49-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64 User : web20 ( 1018) PHP Version : 8.4.23 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/clients/client2/web32/web/ |
Upload File : |
#!/usr/bin/env bash
# =============================================================================
# update.sh — Git-basierter Sync für taschenmuschi-kaufen.de
# -----------------------------------------------------------------------------
# Beidseitig nutzbar:
# • Lokal (Dev-Maschine) → ./update.sh "commit message"
# Commit lokaler Änderungen + Push zum GitHub-Remote.
# • Server (Produktion) → ./update.sh
# Pull der letzten Änderungen vom Remote.
#
# Was wird NICHT synchronisiert:
# Steht in .gitignore — wp-config.php, /wp-content/uploads/, Logs etc.
# Diese Dateien bleiben unverändert, egal in welcher Richtung gesynct wird.
#
# Optionen:
# -m "msg" Commit-Message (kurz für --message)
# --pull nur Pull, auch wenn lokale Änderungen vorliegen (Server-Default)
# --force bei divergierten Branches Rebase ohne Rückfrage
# --help diese Hilfe
#
# Exit-Codes:
# 0 Erfolg / nichts zu tun
# 1 generischer Fehler
# 2 Konflikt — manuelle Auflösung nötig
# =============================================================================
set -euo pipefail
# Skript-Verzeichnis = Repo-Root
cd "$(dirname "$(readlink -f "$0")")"
# ---------- Optionen -----------------------------------------------------------
commit_msg=""
force_pull=0
force_rebase=0
while [[ $# -gt 0 ]]; do
case "$1" in
-m|--message)
commit_msg="${2:-}"
shift 2
;;
--pull)
force_pull=1
shift
;;
--force)
force_rebase=1
shift
;;
--help|-h)
sed -n '2,25p' "$0" | sed 's/^#\s\?//'
exit 0
;;
-*)
echo "Unbekannte Option: $1" >&2
exit 1
;;
*)
# Positionales Argument = Commit-Message
commit_msg="$1"
shift
;;
esac
done
# ---------- Sanity-Checks ------------------------------------------------------
git rev-parse --git-dir >/dev/null 2>&1 || { echo "✘ Kein Git-Repository in $PWD"; exit 1; }
branch=$(git rev-parse --abbrev-ref HEAD)
remote_url=$(git remote get-url origin 2>/dev/null || true)
if [[ -z "$remote_url" ]]; then
echo "✘ Kein 'origin' konfiguriert. Setup via install.sh oder:"
echo " git remote add origin git@github.com:<owner>/<repo>.git"
exit 1
fi
echo "Repo: $PWD"
echo "Branch: $branch"
echo "Remote: $remote_url"
echo
# ---------- Lokale Änderungen? -------------------------------------------------
has_uncommitted=0
if ! git diff --quiet || ! git diff --cached --quiet; then
has_uncommitted=1
fi
# Untracked separat zählen — wir wollen die mit `git add -A` mitnehmen, wenn committet wird.
has_untracked=$(git ls-files --others --exclude-standard | head -1)
[[ -n "$has_untracked" ]] && has_uncommitted=1
if (( has_uncommitted )) && (( ! force_pull )); then
if [[ -n "$commit_msg" ]]; then
echo "→ Committe lokale Änderungen mit: \"$commit_msg\""
echo
git add -A
# Status nach Staging zeigen, dann committen.
git status --short
echo
git commit -m "$commit_msg"
echo
else
echo "⚠ Lokale Änderungen vorhanden, aber keine Commit-Message übergeben:"
git status --short
echo
echo " Optionen:"
echo " 1) Mit Message committen: ./update.sh \"deine message\""
echo " 2) Nur Pull (Server-Modus): ./update.sh --pull"
echo " (uncommitted bleibt lokal — git pull --rebase --autostash sichert ab)"
exit 1
fi
fi
# ---------- Fetch --------------------------------------------------------------
echo "→ Fetch origin/$branch …"
git fetch --prune origin "$branch" 2>&1 | sed 's/^/ /'
echo
local_sha=$(git rev-parse HEAD)
remote_sha=$(git rev-parse "origin/$branch" 2>/dev/null || echo "")
# Remote-Branch existiert noch nicht → initialer Push.
if [[ -z "$remote_sha" ]]; then
echo "→ Remote-Branch existiert noch nicht — initialer Push …"
git push -u origin "$branch"
exit 0
fi
# ---------- Sync-Entscheidung --------------------------------------------------
if [[ "$local_sha" == "$remote_sha" ]]; then
echo "✓ Synchron — nichts zu tun."
exit 0
fi
merge_base=$(git merge-base HEAD "origin/$branch")
if [[ "$local_sha" == "$merge_base" ]]; then
# Wir hängen hinterher → reiner Pull.
echo "→ Remote ist vorne — pull (fast-forward) …"
if (( force_pull )) && (( has_uncommitted )); then
git pull --ff-only --autostash origin "$branch"
else
git pull --ff-only origin "$branch"
fi
echo
echo "✓ Pull abgeschlossen."
elif [[ "$remote_sha" == "$merge_base" ]]; then
# Wir sind vorne → push.
echo "→ Lokal ist vorne — push …"
git push origin "$branch"
echo
echo "✓ Push abgeschlossen."
else
# Beide divergiert.
echo "⚠ Branches sind divergiert."
echo " local : $local_sha"
echo " remote: $remote_sha"
echo " base : $merge_base"
echo
if (( ! force_rebase )); then
read -r -p "Rebase local auf origin/$branch, dann push? [j/N] " ans
[[ "$ans" =~ ^[jJyY]$ ]] || { echo "Abgebrochen."; exit 2; }
fi
git pull --rebase --autostash origin "$branch"
git push origin "$branch"
echo
echo "✓ Rebase + Push abgeschlossen."
fi