Signatur
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
[0]— Die neue Revisionsnummer als Integer.[1]— Datum und Uhrzeit des Commits als String im FormatYYYY-MM-DDTHH:MM:SS.uuuuuuZ.[2]— Der Benutzername des Autors als String.
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;
}
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;
}
// 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.