Start · Sprachen · PHP · Referenz · svn_commit

svn_commit

Funktion

Überträgt Änderungen einer SVN-Arbeitskopie in das Subversion-Repository und gibt Revisionsinformationen zurück.

seit PHP 0.1.0 Kategorie: misc

Signatur

svn_commit(string $log, array $targets, bool $recursive = true): array|false

Beschreibung

svn_commit() gehört zur PECL-Erweiterung svn und ermöglicht es, lokal vorgenommene Änderungen an Dateien und Verzeichnissen einer Subversion-Arbeitskopie direkt aus PHP heraus in das zugehörige Repository zu übertragen (Commit). Die Funktion entspricht dem Kommandozeilen-Befehl svn commit.

Der Parameter $log enthält die Commit-Nachricht, die im Repository-Log gespeichert wird. $targets ist ein Array von Pfaden (lokale Arbeitskopie-Pfade), die committet werden sollen. Wenn $recursive auf true gesetzt ist, werden Verzeichnisse rekursiv einbezogen.

Bei Erfolg gibt die Funktion ein Array mit drei Elementen zurück: der neuen Revisionsnummer, dem Datum/Zeitstempel des Commits sowie dem Autor. Diese Informationen eignen sich etwa für Logging oder zur Anzeige in Deployment-Skripten. Bei einem Fehler wird false zurückgegeben.

Hinweis: Die SVN-PECL-Erweiterung muss auf dem Server installiert und aktiviert sein. Diese Funktion ist besonders nützlich in automatisierten Deployment- oder Build-Skripten, die Änderungen programmatisch einchecken müssen.

Parameter

Name Typ Default Beschreibung
$log Pflicht string Die Commit-Nachricht (Log-Eintrag), die im SVN-Repository gespeichert wird. Sollte aussagekräftig sein und die vorgenommenen Änderungen beschreiben.
$targets Pflicht array Ein Array mit lokalen Pfaden der Arbeitskopie-Dateien oder -Verzeichnisse, die ins Repository übertragen werden sollen. Die Pfade müssen auf eine gültige SVN-Arbeitskopie zeigen.
$recursive bool true Gibt an, ob Verzeichnisse rekursiv verarbeitet werden sollen. Bei true (Standard) werden alle enthaltenen Unterverzeichnisse und Dateien einbezogen.

Rückgabewert

Typ
array|false
Beschreibung
Bei Erfolg ein indiziertes Array mit drei Elementen:
  • [0] — Die neue Revisionsnummer als Integer.
  • [1] — Datum und Uhrzeit des Commits als String im Format YYYY-MM-DDTHH:MM:SS.uuuuuuZ.
  • [2] — Der Benutzername des Autors als String.
Bei einem Fehler (z. B. Netzwerkproblem, Authentifizierungsfehler, Konflikt) wird false zurückgegeben.

Beispiele

Einfacher Commit einer einzelnen Datei

<?php
// Voraussetzung: PECL-Erweiterung 'svn' ist installiert
$workingCopyPath = '/var/www/meinprojekt';
$logMessage = 'Bugfix: Fehler in der Login-Logik behoben';

$result = svn_commit($logMessage, [$workingCopyPath . '/src/login.php']);

if ($result === false) {
    echo 'Commit fehlgeschlagen!' . PHP_EOL;
} else {
    [$revision, $datetime, $author] = $result;
    echo "Commit erfolgreich!" . PHP_EOL;
    echo "Revision : " . $revision . PHP_EOL;
    echo "Zeitpunkt: " . $datetime . PHP_EOL;
    echo "Autor    : " . $author . PHP_EOL;
}
Commit erfolgreich! Revision : 1042 Zeitpunkt: 2024-03-15T10:23:45.000000Z Autor : deploy-user

Rekursiver Commit eines gesamten Verzeichnisses mit Fehlerbehandlung

<?php
$targets = ['/var/www/meinprojekt/src'];
$log     = 'Release 2.5.0: Neue Features und Performance-Verbesserungen';

// Authentifizierung ggf. vorher setzen:
// svn_auth_set_parameter(SVN_AUTH_PARAM_DEFAULT_USERNAME, 'user');
// svn_auth_set_parameter(SVN_AUTH_PARAM_DEFAULT_PASSWORD, 'passwort');

$result = svn_commit($log, $targets, true);

if ($result !== false) {
    echo sprintf(
        'Revision %d erfolgreich committed von "%s" am %s',
        $result[0],
        $result[2],
        $result[1]
    ) . PHP_EOL;
} else {
    error_log('SVN Commit fehlgeschlagen für Targets: ' . implode(', ', $targets));
    echo 'Commit fehlgeschlagen. Details im Error-Log.' . PHP_EOL;
}
Revision 1043 erfolgreich committed von "deploy-user" am 2024-03-15T10:30:00.000000Z

// Wichtig · Fallstricke

Sicherheitshinweis: Übergeben Sie niemals vom Benutzer eingegebene Strings direkt als $log-Nachricht oder als Pfade in $targets, ohne diese vorher zu validieren und zu bereinigen. Ansonsten könnten Angreifer beliebige Pfade des Dateisystems ansprechen.

Authentifizierung: Authentifizierungsdaten für das SVN-Repository sollten zuvor über svn_auth_set_parameter() mit den Konstanten SVN_AUTH_PARAM_DEFAULT_USERNAME und SVN_AUTH_PARAM_DEFAULT_PASSWORD gesetzt werden. Das Speichern von Passwörtern im Quellcode ist jedoch grundsätzlich zu vermeiden — besser Umgebungsvariablen oder einen Secrets-Manager nutzen.

Erweiterung: svn_commit() ist Teil der PECL-Erweiterung svn, die separat installiert werden muss (pecl install svn). Sie ist nicht in einer Standard-PHP-Installation enthalten. Außerdem muss die Subversion-Bibliothek (libsvn) auf dem System vorhanden sein.

Konflikte: Wenn die Arbeitskopie Konflikte aufweist, wird der Commit fehlschlagen und false zurückgeben. Konflikte müssen zuerst mit svn_resolved() oder svn_update() aufgelöst werden.