Frage

Die Subversion Konzept der Verzweigung wird auf die Schaffung eines [un] stabile Gabel des gesamten Repository, auf der Entwicklung zu tun konzentrieren. Gibt es einen Mechanismus für Zweige einzelner Dateien erstellen?

Für einen Anwendungsfall, denken Sie an einem gemeinsamen Header (* .h) Datei, die mehrere plattformspezifische Quelle (* .c) Implementierungen hat. Dieser Typ von Verzweigung ist ein permanenter. All diese Zweige würden laufende Entwicklung mit gelegentlicher Querzweig Verschmelzung sehen. Dies steht in scharfem Kontrast zu instabilem Entwicklung / stable Release Zweige, die im Allgemeinen eine begrenzte Lebensdauer haben.

I nicht wollen das gesamte Repository (billig oder nicht) verzweigen, da sie eine unzumutbare Menge von Wartung kontinuierlich zwischen dem Stamm und allen Zweigen schaffen würde zu verschmelzen. Derzeit bin ich mit Clearcase, die ein anderes Konzept hat die Verzweigung, dass diese einfach macht. Ich habe zu SVN gebeten zu prüfen, den Übergang aber dieses Paradigma Unterschied ist wichtig. Ich bin viel mehr Sorgen um leicht in der Lage, alternative Versionen für einzelne Dateien zu erstellen, als über Dinge wie einen stabilen Release-Zweig schneiden.

War es hilfreich?

Lösung

Leider finde ich die richtige Antwort hier ist, dass Clearcase viel besser als Subversion diese Situation behandelt. Mit Subversion, müssen Sie verzweigen alles , aber Clearcase ermöglicht eine Art „faul Zweig“ Idee, dass nur eine bestimmte Gruppe von Dateien bedeutet verzweigt sind, von denen der Rest noch dem Stamm folgen (oder je nachdem, was Zweig geben Sie an).

Die anderen Lösungen hier zur Verfügung gestellten nicht wirklich funktionieren, wie Sie beabsichtigen, sie kopieren Sie einfach die Datei auf einen anderen Pfad. Nun müssen Sie seltsame Dinge tun, um tatsächlich die Datei zu verwenden.

Erm, sorry. Das war nicht wirklich eine sehr gute Antwort. Aber es ist keine gute Lösung für dieses Problem mit Subversion. Sein Modell ist Zweig und verschmelzen.

Edit: OK, so erweitert, was crashmstr sagte. Sie können dies tun:

svn cp $REP/trunk/file.h $REP/branched_files/file.h
svn co $REP/trunk
svn switch $REP/branched_files/file.h file.h

Aber wow !, ist, dass fehleranfällig. Jedes Mal, wenn Sie eine svn tun st Sie werden sehen:

svn st
    S  file.h

Ein bisschen laut, dass. Und wenn Sie ein paar Dateien oder Module in einer großen Quell-Repository verzweigen wollen wird es beginnen, sehr chaotisch zu bekommen.

Eigentlich gibt es wahrscheinlich ein ordentliches Projekt hier für so etwas wie Clearcase der verzweigten Dateien mit svn Eigenschaften und Schalten zu simulieren, und eine Hülle um das Moor Standard SVN-Client zu schreiben mit dem ganzen Schlamassel zu beschäftigen.

Andere Tipps

Sie müssen nicht das gesamte Repository verzweigen. Sie könnten Zweige des Ordners in Ihrem Projekt (wie zum Beispiel eines Include-Ordner) machen. Wie andere bereits erwähnt haben, können Sie auch eine „Kopie“ von nur einer einzigen Datei tun. Sobald Sie eine Kopie einer Datei oder ein Ordner haben, Sie „Schalter“ in der verzweigten Datei oder einen Ordner auf der Zweig-Version zu arbeiten.

Wenn Sie erstellen einen separaten Zweig Ordner im Repository, können Sie Ihre verzweigten Dateien dort über serverseitige Befehle kopieren konnten:

svn copy svn://server/project/header.h svn://server/branched_files/header.h

Dann können Sie diese Datei wechseln den branches_files Repository-Pfad zu verwenden,

Hier ist, wie ich das Problem verstehen. Sie haben den folgenden Baum:

time.h
time.c

und Sie müssen es für mehrere Architekturen sinken:

time.h is comon
time.c (for x386), time.c (for ia64), time.c (for alpha),...

Auch in der aktuellen VCS können Sie dies tun, indem so viele Zweige von time.c zu schaffen je nach Bedarf und wenn Sie die Dateien aus dem VCS Kasse prüfen Sie automatisch die neueste time.h aus dem gemeinsamen Stamm und die neuesten time.c aus der Branche arbeiten Sie.

Das Problem Sie besorgt sind, dass, wenn Sie SVN verwenden, wenn ein Zweig Check-out werden Sie time.h von Stamm führen sehr oft oder das Risiko auf eine ältere Datei arbeiten (im Gegensatz zu dem Stamm verglichen), dass die Menge an Overhead ist Ihnen nicht akzeptabel.

Je nach Struktur des Quellcodes, könnte es eine Lösung, obwohl sein. vorstellen, dass Sie

 
/
/headers/
/headers/test.h
/source/
/source/test.c

Dann könnten Sie verzweigen / und verwenden Sie die svn: externals Funktion können Sie Ihre Kopfzeilen auf den Stamm Kopf zu verbinden. Es funktioniert nur auf Verzeichnisse und trägt einige Einschränkungen in Bezug auf zurück zu test.h begehen (Sie müssen im Header-Verzeichnis gehen, damit es funktioniert), aber es könnte funktionieren.

Eine Subversion „Zweig“ ist nur eine Kopie von etwas in Ihrem Repository. Also, wenn Sie wollen, eine Datei verzweigen, würden Sie gerade tun:

svn copy myfile.c myfile_branch.c

Ich glaube nicht, dass es viel Sinn, eine einzelne Datei in Verzweigung? Es gibt keine Möglichkeit, es mit dem Stamm-Code zu testen?

Sie können einen Patch nehmen statt, wenn Sie Änderungen sichern möchten, und wenden Sie sie später.

Sind Sie sicher, dass Sie wirklich diese Funktion benötigen in Ihrem VCS

Warum nicht den C-Präprozessor verwenden und den Code, den Sie brauchen nicht #IFDEF weg? Oder ein ähnliches Werkzeug.

so etwas wie:

// foo.h:
void Foo();

// foo_win32.c
#ifdef _WIN32
void Foo()
{
   ...
}
#endif

// foo_linux.c
#ifdef _GNUC
void Foo()
{
   ...
}
#endif

Manchmal, wenn es nicht richtig passt, dann ist es nicht die richtige Lösung.

Ein Zweig in SVN ist nur eine Kopie. Ich glaube, dass es die Art und Weise zu tun, Sie hoffen, zu, dann würden Sie jede Version der Datei in einem separaten Verzeichnis im Repository haben müssen, und überprüfen Sie es in Ihren Quellordner aus. I.E. behandelt diese Datei wie ein eigenständiges Projekt.

Ein Zweig in Subversion ist genau das, was über Sie sprechen. Alle Dateien sind eine exakte Kopie des Rumpfes, mit Ausnahme von denen, die Sie ändern. Dies ist der „billigere Kopie“ -Methodik über im SVN Buch gesprochen. Die einzige Einschränkung ist die Notwendigkeit, den Stamm in den Zweig von Zeit zu Zeit zu fusionieren, um sicherzustellen, dass die Änderungen dort in der Branche widerspiegelt. Natürlich, wenn diese Änderungen nicht erwünscht sind, müssen keine trunk-> Zweig verschmilzt passieren.

Eine einfache Möglichkeit für Änderungen vom Stamm zu ermöglichen, automatisch zusammengeführt werden (die die Clear Case Paradigma simuliert) wäre ein pre-commit Hook-Skript zu verwenden, um die Änderungen vom Stamm in vor dem begehen zu verschmelzen. (In der Tat, dies ist immer eine gute Strategie Code Drift).

zu verhindern
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top