git:dateien-direkt-ueber-shell-vom-webserver-nach-github-schieben

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

git:dateien-direkt-ueber-shell-vom-webserver-nach-github-schieben [22.07.2025 12:09] – angelegt Martin Fitzelgit: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 /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
 +
 +<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).
 +</WRAP>
 +\\ \\ \\ 
 +==== 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://<TOKEN>@github.com/modellbahn-anlage/Wiki.git
 +
 +<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.
 +</WRAP>
 +\\ \\ \\ 
 +==== 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:
 +
 +<code>
 +#!/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
 +</code>
 +\\ \\ 
 +=== 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) ===
 +<code>*/10 * * * * /hp/cv/aa/ok/www/modellbahn-anlage.de/wiki/git-auto.sh >> /hp/cv/aa/ok/www/git-auto-commit.log 2>&1</code>
 +\\ \\ 
 +=== 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**
 +<code>15 3 1 * *</code>
 +
 +**leert die Datei einfach (ohne sie zu löschen)**
 +<code>></code>
 +
 +
 +==== 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) ====
 +
 +<code>
 +<?php
 +// Lade Umgebungsvariablen aus einer .env-Datei im übergeordneten Verzeichnis
 +function loadEnv($path) {
 +    if (!file_exists($path)) {
 +        echo ".env-Datei nicht gefunden: $path\n";
 +        exit(1);
 +    }
 +
 +    $lines = file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
 +    foreach ($lines as $line) {
 +        if (str_starts_with(trim($line), '#')) continue;
 +        list($name, $value) = explode('=', $line, 2);
 +        putenv(trim($name) . '=' . trim($value));
 +    }
 +}
 +
 +// .env liegt im übergeordneten Ordner
 +loadEnv(__DIR__ . '/../.env');
 +
 +$repoPath = __DIR__;
 +$user = getenv('GIT_USER');
 +$token = getenv('GIT_TOKEN');
 +$remoteUrl = "https://$user:$token@github.com/<color #fff200>NAME DES VERZEICHNISES/GIT_NAME</color>.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 '<color #fff200>E-Mail</color>'", $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";
 +?>
 +
 +</code>