2009-09-04 3 views
10

Ich habe ein Verzeichnis auf einem Linux-System, das meistens Symlinks zu Dateien in einem anderen Dateisystem enthält. Ich möchte das Verzeichnis zu einem Subversion-Repository hinzufügen, indem ich die symbolischen Links im Prozess dereferenziere (sie als die Dateien behandeln, auf die sie verweisen, und nicht als Links). Im Allgemeinen möchte ich in der Lage sein, alle Arbeitskopieoperationen mit diesem Verhalten durchzuführen, aber der 'svn add' Befehl ist dort, wo er startet, denke ich.Kann der Subversion-Client (svn) symbolische Links aufheben, als wären sie Dateien?

Das SVN-Client-Dienstprogramm scheint keine Optionen in Bezug auf Symlink-Dereferenzierung in der Arbeitskopie zu haben. Ich habe auch im Handbuch (http://svnbook.red-bean.com/en/1.5/index.html) keine Hinweise darauf gefunden.

fand ich ein Plakat auf dem SVN-Benutzer-Mailingliste, die die gleiche Frage gestellt, aber nie eine Antwort erhalten, hier:

(Das Plakat endete harte Links anstelle von Symlinks Diese Technik ist in meinem Fall keine Option, da sich die eigentlichen Dateien in einem separaten Dateisystem befinden.)

Ich benutze Subversion v1.6.1 auf Fedora 11.

Für was es wert ist, weiß ich, dass es alternative Tools/Techniken gibt, die helfen könnten, dieses Verhalten zu approximieren, die ich aber aus verschiedenen Gründen verwerfen muss. Ich habe diese Möglichkeiten [und Staub-Binned] bereits in Betracht gezogen: - ein "Union" -Mount, das alle Verzeichnisse, die die echten Dateien enthalten, mit dem SVN-Arbeitskopieverzeichnis als die "oberste" Ebene in der Union zusammenführt; - Kopieren/Verschieben der realen Dateien in dasselbe Dateisystem wie die SVN-Arbeitskopie und Verwenden von Hardlinks anstelle von Symlinks; - Nicht-SVN Versionskontrollsysteme. Das waren alles nette Ideen, und ich bin mir sicher, dass sie gute Lösungen für andere Probleme sind, aber sie werden angesichts der Einschränkungen dieser Umgebung und Situation nicht funktionieren.

+0

Ich glaube einfach nicht, dass das möglich ist (und ich glaube nicht, dass VCS dies tun kann, es folgt entweder Symlinks, aber kann sie nicht verfolgen, oder es verfolgt sie und folgt nicht). – tonfa

+0

Es sieht so aus. Das scheint blöd, da die meisten Dienstprogramme, die Pfadkonstrukte manipulieren (cp, mv, ln, rm, rsync) alle über Optionen verfügen, um zu spezifizieren, dass symbolische Links dereferenziert und nicht wörtlich behandelt werden sollten. Ich meine, ist es nur ich, oder verringert das Fehlen einer Option "Dereferenzierung" die Funktionalität des Tools? (Wenn ich alleine bin, werde ich wahrscheinlich keine Mühe haben, eine Feature-Anfrage an das SVN-Projekt zu senden.) –

+0

3 Jahre zu spät, aber du bist nicht allein. Ich brauche das auch. –

Antwort

1

Sie haben viele Einschränkungen, aber es gibt eine Sache, die immer funktioniert: hacken Sie die Quelle.

Sie können leicht Ihre eigene svn für Linux erstellen, obwohl diese Mod kann oder nicht "einfach" sein. Wie auch immer, wenn du keine verwalteten symbolischen Links hast, kannst du einen groben Hack machen und einfach nur svn folgen, als wären sie harte Links.

Wenn Ihr Repository versionierte Links enthält und Sie diesen Teil davon auschecken müssen, benötigen Sie einen komplexeren Hack, der beispielsweise eine Eigenschaft verwendet, die das Feature pro Datei oder pro Hierarchie oder etwas steuert.

Es könnte eine andere Wahl geben: versionierte Links erschienen in 1.1.0, wenn das Verhalten davor symbolischen Links folgte, dann könnte man vielleicht einfach einen alten Client laufen lassen.

+0

Also sagen Sie die Antwort auf meine eigentliche Frage (kann der SVN-Client es tun) ist "Nein". Recht? –

+1

Richtig, ich sage "nein, zumindest nicht seit 1.1.0 und vielleicht auch nicht davor". Ich nehme an, Sie haben in Erwägung gezogen, die anderen Dateisystembäume hinzuzufügen und dann nur lokale nicht versionierte Symlinks beizubehalten. Das scheint gut zu funktionieren, außer dass mehr als ein Commit oder Update erforderlich ist, um die gesamte Arbeitskopie zu synchronisieren. (Aber nicht auf anderen Arbeitskopien ohne die lokalen Links.) – DigitalRoss

0

Idee: injizieren Sie eine gemeinsam genutzte Bibliothek mit LD_PRELOAD, die stat/open/unlink etc abfängt, so dass Svn die Symlinks nicht sieht. Das würde dich davor bewahren, die Svn-Quelle modifizieren zu müssen.

0

Sie könnten auch physische Verbindungen anstelle von symbolischen Verbindungen verwenden.

0

Soweit ich weiß, gibt es mit der aktuellen Subversion Version (1.6.x) keine Möglichkeit das zu tun. Wenn es für Dateien (nicht Verzeichnisse) auf demselben Dateisystem gewesen wäre, hätten Sie harte Verbindungen verwenden können (ohne den -s Schalter in ln Befehl).

0

Ich stand vor einer ähnlichen Herausforderung. Mein Home-Verzeichnis enthält viele Skripte in ~/scripts verstreut über verschiedene Unterverzeichnisse. Ich wollte jedoch ein saubereres Layout in SVN, das den Mitarbeitern bei der Suche nach Codebeispielen hilft.

Ich habe ein ~/scripts/svn/signal15/code/ Verzeichnis mit prod und test Unterverzeichnissen darunter, dann fest verbunden all anderswo verstreuter Skripten.

Der folgende Befehl importierte dann das Verzeichnis/Dateilayout, das ich benötigte;

cd ~/scripts ; svn import svn http://svn_server/repos/code

Die Repo zeigt nun http://svn_server/repos/code/signal15/ mit "prod" und "Test" Unterverzeichnisse.

Ich habe jetzt benutzerdefinierte Layouts; a) Das Layout meines Home-Verzeichnisses bleibt unverändert (sans ~/scripts/svn Unterverzeichnis) b) Das SVN-Repository enthält einen "signal15" -Zweig mit meinen organisierten Skripten. P.: Mit einer Shell-Funktion kann ich auch nach Bedarf ein- und auschecken.

Verwandte Themen