Signatur
Beschreibung
svn_fs_copy ist Teil der PECL-Erweiterung svn und ermöglicht es, eine Datei oder ein Verzeichnis innerhalb des Subversion-Dateisystems (FS) zu kopieren. Dabei werden sowohl der Quell-Root als auch der Ziel-Root als Ressourcen übergeben, die zuvor über Funktionen wie svn_fs_revision_root oder svn_fs_txn_root erzeugt wurden.
Im Gegensatz zu einem einfachen Datei-Kopieren in Subversion wird die Kopie mit voller Versionshistorie verknüpft (cheap copy), was dem svn copy-Kommando auf Kommandozeilen-Ebene entspricht. Das bedeutet, dass SVN den Ursprung der Kopie intern verfolgt, ohne den Inhalt physisch zu duplizieren.
Die Funktion eignet sich besonders für das programmatische Erstellen von Branches oder Tags innerhalb einer SVN-Transaktion. Der Ziel-Root muss in der Regel ein beschreibbarer Transaktions-Root sein, damit die Änderung committed werden kann.
Beachte, dass diese Funktion zur PECL-Erweiterung svn gehört und daher auf dem System installiert und aktiviert sein muss. In modernen Projekten wird SVN häufig durch Git ersetzt, weshalb diese Funktion heute seltener eingesetzt wird.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $from_root Pflicht | resource | Die Quell-Root-Ressource des Subversion-Dateisystems, aus der kopiert werden soll. Wird typischerweise über svn_fs_revision_root erzeugt. |
|
| $from_path Pflicht | string | Der absolute Pfad innerhalb des Quell-Roots zur Datei oder zum Verzeichnis, das kopiert werden soll (z. B. /trunk/meinprojekt). |
|
| $to_root Pflicht | resource | Die Ziel-Root-Ressource des Subversion-Dateisystems. Muss ein beschreibbarer Transaktions-Root sein, damit Änderungen persistiert werden können. | |
| $to_path Pflicht | string | Der absolute Zielpfad innerhalb des Ziel-Roots, unter dem die Kopie abgelegt werden soll (z. B. /branches/mein-branch). |
Rückgabewert
true zurück, wenn die Kopie erfolgreich durchgeführt wurde, andernfalls false.Beispiele
Einen Branch per Transaktion erstellen
<?php
// Repository öffnen
$repos = svn_repos_open('/var/svn/meinrepo');
$fs = svn_repos_fs($repos);
// Aktuelle HEAD-Revision ermitteln
$rev = svn_fs_youngest_rev($fs);
// Neue Transaktion starten
$txn = svn_repos_fs_begin_txn_for_commit($repos, $rev, 'autor', 'Branch erstellt');
$txn_root = svn_fs_txn_root($txn);
// Quell-Root (Revision) holen
$rev_root = svn_fs_revision_root($fs, $rev);
// trunk nach branches/mein-branch kopieren
$result = svn_fs_copy($rev_root, '/trunk', $txn_root, '/branches/mein-branch');
if ($result) {
// Transaktion committen
svn_repos_fs_commit_txn($txn);
echo "Branch erfolgreich erstellt.\n";
} else {
echo "Fehler beim Kopieren.\n";
}
Datei innerhalb einer Transaktion kopieren
<?php
$repos = svn_repos_open('/var/svn/meinrepo');
$fs = svn_repos_fs($repos);
$rev = svn_fs_youngest_rev($fs);
$rev_root = svn_fs_revision_root($fs, $rev);
$txn = svn_repos_fs_begin_txn_for_commit($repos, $rev, 'autor', 'Datei kopiert');
$txn_root = svn_fs_txn_root($txn);
// Einzelne Datei kopieren
$ok = svn_fs_copy($rev_root, '/trunk/config.php', $txn_root, '/trunk/config.bak.php');
if ($ok) {
svn_repos_fs_commit_txn($txn);
echo "Datei erfolgreich kopiert.\n";
} else {
echo "Kopieren fehlgeschlagen.\n";
}
// Wichtig · Fallstricke
Wichtig: Diese Funktion ist Teil der PECL-Erweiterung svn, die separat installiert werden muss (pecl install svn). Sie steht nicht in einer Standard-PHP-Installation zur Verfügung.
Der Ziel-Root muss ein beschreibbarer Transaktions-Root sein (erzeugt mit svn_fs_txn_root). Ein Revisions-Root ist schreibgeschützt und kann nicht als Ziel verwendet werden.
Die Funktion ist seit Jahren wenig aktiv gewartet. In modernen Umgebungen sollte geprüft werden, ob die SVN-PECL-Erweiterung mit der aktuellen PHP-Version kompatibel ist. Für neue Projekte empfiehlt sich der Einsatz von Git zusammen entsprechenden PHP-Bibliotheken.