====== 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 /www/modellbahn-anlage.de/wiki/httpdocs git init git remote add origin https://github.com/modellbahn-anlage/Wiki.git git branch -M master **Erster Commit (wenn noch keine .git-Struktur vorhanden ist):** git add . git commit -m "Initial commit Web-Server" git push -u origin master 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://github.com/settings/tokens]] - Wähle: Fine-grained token - Vergib: - Repository-Zugriff: Nur auf modellbahn-anlage/Wiki - Berechtigungen: Contents: Read and Write - Speichern und Token kopieren (wird nur 1× angezeigt) **Git so konfigurieren, dass der Token verwendet wird:** git config --global user.name "DeinGitHubBenutzername" git config --global user.email "deine@email.de" Dann die Remote-URL mit Token dauerhaft speichern: git remote set-url origin https://@github.com/modellbahn-anlage/Wiki.git 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 /hp/cv/aa/ok/www/modellbahn-anlage.de/wiki/httpdocs # Ins Verzeichnis wechseln git add . # Alle Änderungen hinzufügen git commit -m "Manueller Commit via Shell am $(date '+%Y-%m-%d %H:%M:%S')" # Commit erstellen git pull --rebase origin master # Aktuelle Änderungen von GitHub holen und mit deinen kombinieren git push origin master # Änderungen auf GitHub übertragen \\ \\ \\ ==== 5. Cronjob für nächtliche Versionierung ==== === 1. Skript ertsellen z.B. /hp/cv/aa/ok/www/modellbahn-anlage.de/wiki/git-auto.sh: === mit dem Inhalt: #!/bin/sh cd /hp/cv/aa/ok/www/modellbahn-anlage.de/wiki/httpdocs || exit 1 # Nur committen, wenn sich etwas geändert hat if ! git diff --quiet || ! git diff --cached --quiet; then TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') git add . git commit -m "Auto-Commit am $TIMESTAMP" git pull --rebase origin master git push origin master fi \\ \\ === 2. Ausführbar machen === chmod +x /hp/cv/aa/ok/www/modellbahn-anlage.de/wiki/git-auto.sh \\ \\ === 3. Cronjob setzen (alle 10 Minuten für Tests) === */10 * * * * /hp/cv/aa/ok/www/modellbahn-anlage.de/wiki/git-auto.sh >> /hp/cv/aa/ok/www/git-auto-commit.log 2>&1 \\ \\ === 4. Cronjob für 1x täglich === 0 3 * * * /hp/cv/aa/ok/www/modellbahn-anlage.de/wiki/git-auto.sh >> /hp/cv/aa/ok/www/git-auto-commit.log 2>&1 \\ \\ ==== Logile im GIT leeren ==== **Cronjob (z. B. jeden 1. des Monats um 03:15 Uhr)** 15 3 1 * * > /hp/cv/aa/ok/www/git-auto-commit.log **Am 1. jedes Monats um 03:15 Uhr** 15 3 1 * * **leert die Datei einfach (ohne sie zu löschen)** > ==== Cache nicht mehr übertragen ==== git rm -r --cached data/cache/ git commit -m "Remove cache from tracking" ==== PHP-Datei zum manuellen ausführen (git-backup.php) ==== NAME DES VERZEICHNISES/GIT_NAME.git"; $commitMessage = "Automatisches Backup am " . date('Y-m-d H:i:s'); // Git-Befehle ausführen function git($command, $cwd) { $output = []; exec("cd " . escapeshellarg($cwd) . " && $command 2>&1", $output, $ret); if ($ret !== 0) { echo "? Fehler bei '$command':\n" . implode("\n", $output) . "\n"; exit(1); } return $output; } // Git init bei Bedarf if (!is_dir("$repoPath/.git")) { git("git init", $repoPath); git("git remote add origin \"$remoteUrl\"", $repoPath); } // Benutzerkonfiguration für Git setzen git("git config user.name 'Dokuwiki Bot'", $repoPath); git("git config user.email 'E-Mail'", $repoPath); // Submodule löschen $rii = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($repoPath)); foreach ($rii as $file) { if ($file->isDir() && $file->getFilename() === '.git' && $file->getPath() !== $repoPath) { exec("rm -rf " . escapeshellarg($file->getPathname())); } } // Änderungen vorbereiten git("git add .", $repoPath); $status = git("git status --porcelain", $repoPath); if (empty($status)) { echo "?? Keine Änderungen gefunden – nichts zu committen.\n"; exit; } // Commit & Push git("git commit -m \"" . addslashes($commitMessage) . "\"", $repoPath); git("git push --set-upstream origin master", $repoPath); // Hier wird das Token in der Remote-URL bereits verwendet echo "? Backup erfolgreich auf GitHub übertragen.\n"; ?>