Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| git:dateien-direkt-ueber-shell-vom-webserver-nach-github-schieben [22.07.2025 12:09] – angelegt Martin Fitzel | git:dateien-direkt-ueber-shell-vom-webserver-nach-github-schieben [Unbekanntes Datum] (aktuell) – Externe Bearbeitung (Unbekanntes Datum) 127.0.0.1 | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== Dateien direkt über Shell vom Webserver nach GitHub schieben ====== | ||
| + | |||
| + | |||
| + | ===== Einrichten von GIT auf Webserver ===== | ||
| + | |||
| + | ==== 1. Wir prüfen die GIT Version mit ==== | ||
| + | |||
| + | git --version | ||
| + | | ||
| + | Als Antwort bekommt, man so etwas wie "git version 2.34.1" | ||
| + | |||
| + | \\ \\ \\ | ||
| + | ==== 2. Lokales Git-Repository auf dem Server einrichten ==== | ||
| + | |||
| + | cd / | ||
| + | git init | ||
| + | git remote add origin https:// | ||
| + | git branch -M master | ||
| + | | ||
| + | **Erster Commit (wenn noch keine .git-Struktur vorhanden ist):** | ||
| + | |||
| + | git add . | ||
| + | git commit -m " | ||
| + | git push -u origin master | ||
| + | |||
| + | <WRAP round tip 60%> | ||
| + | Git fragt hier nach Benutzername und Passwort – das geht nicht mehr per Klartext. Du brauchst ein GitHub-Personal Access Token (siehe nächster Punkt). | ||
| + | </ | ||
| + | \\ \\ \\ | ||
| + | ==== 3. GitHub-Zugang per Token (ohne Passwort) ==== | ||
| + | |||
| + | **Token erzeugen:** | ||
| + | |||
| + | - Gehe zu [[https:// | ||
| + | - Wähle: Fine-grained token | ||
| + | - Vergib: | ||
| + | - Repository-Zugriff: | ||
| + | - Berechtigungen: | ||
| + | - Speichern und Token kopieren (wird nur 1× angezeigt) | ||
| + | |||
| + | **Git so konfigurieren, | ||
| + | |||
| + | git config --global user.name " | ||
| + | git config --global user.email " | ||
| + | |||
| + | Dann die Remote-URL mit Token dauerhaft speichern: | ||
| + | git remote set-url origin https://< | ||
| + | |||
| + | <WRAP round important 60%> | ||
| + | Achtung: Diese URL enthält den Token im Klartext. Er sollte nicht öffentlich einsehbar sein (z. B. in HTML-Dateien oder Logs). Git speichert ihn aber nur lokal. | ||
| + | </ | ||
| + | \\ \\ \\ | ||
| + | ==== 4. Übertragung per Hand anstoßen ==== | ||
| + | |||
| + | Um das ganze aus der Shell heraus zu starten, gibt es diese Befehle: | ||
| + | |||
| + | cd / | ||
| + | git add . # Alle Änderungen hinzufügen | ||
| + | git commit -m " | ||
| + | git pull --rebase origin master | ||
| + | git push origin master | ||
| + | |||
| + | \\ \\ \\ | ||
| + | ==== 5. Cronjob für nächtliche Versionierung ==== | ||
| + | |||
| + | === 1. Skript ertsellen z.B. / | ||
| + | |||
| + | mit dem Inhalt: | ||
| + | |||
| + | < | ||
| + | #!/bin/sh | ||
| + | cd / | ||
| + | |||
| + | # Nur committen, wenn sich etwas geändert hat | ||
| + | if ! git diff --quiet || ! git diff --cached --quiet; then | ||
| + | TIMESTAMP=$(date ' | ||
| + | git add . | ||
| + | git commit -m " | ||
| + | git pull --rebase origin master | ||
| + | git push origin master | ||
| + | fi | ||
| + | </ | ||
| + | \\ \\ | ||
| + | === 2. Ausführbar machen === | ||
| + | |||
| + | chmod +x / | ||
| + | \\ \\ | ||
| + | === 3. Cronjob setzen (alle 10 Minuten für Tests) === | ||
| + | < | ||
| + | \\ \\ | ||
| + | === 4. Cronjob für 1x täglich === | ||
| + | 0 3 * * * / | ||
| + | | ||
| + | \\ \\ | ||
| + | ==== Logile im GIT leeren ==== | ||
| + | **Cronjob (z. B. jeden 1. des Monats um 03:15 Uhr)** | ||
| + | |||
| + | 15 3 1 * * > / | ||
| + | |||
| + | **Am 1. jedes Monats um 03:15 Uhr** | ||
| + | < | ||
| + | |||
| + | **leert die Datei einfach (ohne sie zu löschen)** | ||
| + | < | ||
| + | |||
| + | |||
| + | ==== Cache nicht mehr übertragen ==== | ||
| + | |||
| + | git rm -r --cached data/cache/ | ||
| + | git commit -m " | ||
| + | |||
| + | | ||
| + | ==== PHP-Datei zum manuellen ausführen (git-backup.php) ==== | ||
| + | |||
| + | < | ||
| + | <?php | ||
| + | // Lade Umgebungsvariablen aus einer .env-Datei im übergeordneten Verzeichnis | ||
| + | function loadEnv($path) { | ||
| + | if (!file_exists($path)) { | ||
| + | echo " | ||
| + | exit(1); | ||
| + | } | ||
| + | |||
| + | $lines = file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); | ||
| + | foreach ($lines as $line) { | ||
| + | if (str_starts_with(trim($line), | ||
| + | list($name, $value) = explode(' | ||
| + | putenv(trim($name) . ' | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // .env liegt im übergeordneten Ordner | ||
| + | loadEnv(__DIR__ . '/ | ||
| + | |||
| + | $repoPath = __DIR__; | ||
| + | $user = getenv(' | ||
| + | $token = getenv(' | ||
| + | $remoteUrl = " | ||
| + | $commitMessage = " | ||
| + | |||
| + | // Git-Befehle ausführen | ||
| + | function git($command, | ||
| + | $output = []; | ||
| + | exec(" | ||
| + | if ($ret !== 0) { | ||
| + | echo "? Fehler bei ' | ||
| + | exit(1); | ||
| + | } | ||
| + | return $output; | ||
| + | } | ||
| + | |||
| + | // Git init bei Bedarf | ||
| + | if (!is_dir(" | ||
| + | git(" | ||
| + | git(" | ||
| + | } | ||
| + | |||
| + | // Benutzerkonfiguration für Git setzen | ||
| + | git(" | ||
| + | git(" | ||
| + | |||
| + | // Submodule löschen | ||
| + | $rii = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($repoPath)); | ||
| + | foreach ($rii as $file) { | ||
| + | if ($file-> | ||
| + | exec(" | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Änderungen vorbereiten | ||
| + | git(" | ||
| + | $status = git(" | ||
| + | |||
| + | if (empty($status)) { | ||
| + | echo "?? Keine Änderungen gefunden – nichts zu committen.\n"; | ||
| + | exit; | ||
| + | } | ||
| + | |||
| + | // Commit & Push | ||
| + | git(" | ||
| + | git(" | ||
| + | |||
| + | echo "? Backup erfolgreich auf GitHub übertragen.\n"; | ||
| + | ?> | ||
| + | |||
| + | </ | ||