2009-04-28 6 views
5

Wir verstehen die Ausfall- und in der Regel SVN-Repository Organisation empfohlen, bei mehreren Projekten mit, ist so etwas wie dieses:Ist es eine gute Idee, alle Projekte in den gleichen Stamm zu legen?

root/projectA/(trunk, branches, tags) 
root/projectB/(trunk, branches, tags) 
... 

Unsere Projekte viel Interdependenz haben, und das wäre eine extense Verwendung von svn verlangen : external zwischen ihnen, in Anbetracht der Tatsache, dass wir nicht dll Bezug auf interne Projekte, würden wir lieber ihren Quellcode sehen, anstatt mit Binärdateien zu arbeiten.

Wenn zu viele externe Elemente verwendet werden, kann das Verzweigen von Repositorys und das Synchronisieren von Änderungen zu einer komplexen und fehleranfälligen Erfahrung werden, sodass das Team dieser Lösung überhaupt nicht vertraut hat.

Also schlug ein Teammitglied etwas vor, dass wir alle denken, dass dies eine bessere Lösung sein könnte: Alle Projekte in den gleichen Stamm legen.

Zuerst erkannten wir einige Probleme mit diesem Ansatz, aber insgesamt stimmen wir zu, dass diese Probleme auf hypothetischen Situationen basieren, die wir höchstwahrscheinlich nie erleben würden.

Sehen Sie einige schwerwiegende Probleme mit dieser Lösung?

Antwort

4

Wir machen das bei unserer Firma und hatten viel Erfolg.

Wir haben 3 Top-Level-Verzeichnisse:

  • Tags
  • Zweige
  • Stamm

Und dann haben wir jedes Projekt als ein Unterverzeichnis von denen.

Wir verzweigen immer noch auf der Projektebene und verwenden immer noch svn: externals. Aber wenn wir einen kleineren Quellbaum hätten, würden wir auf der Stammebene verzweigen und nicht svn: extenrals verwenden.

Es ist nett, den Stamm aller Projekte an der gleichen Stelle zu haben. Sie können es sichern, Sie können alles überprüfen und Sie haben die neuesten Sachen zusammen. Du hast nicht die einzigen Standort für alle Branchen noch einzigen Standort für alle Tags verlieren entweder weil sie alle in einem Unterverzeichnis von/branches/projectX und/tags/projectX

Probleme mit svn: externals:

Wenn Ihre Projekte nicht sehr RIESIG sind, dann können Sie einfach den ganzen Stamm verzweigen und alle Probleme mit svn: externals vermeiden.

Das Problem mit svn: externals ist, dass wenn Sie eine Verzweigung machen, es nicht automatisch eine Verzweigung für jedes der svn: externals für Sie erstellt. Dies ist ein Problem, denn im Laufe der Zeit werden all Ihre alten Zweige nicht mehr kompiliert werden können, da Ihr Stamm mehr aktualisiert wird. Ein weiteres Problem besteht darin, dass wenn Sie einen Fehler in einer Verzweigung zu einem svn: external beheben, alle anderen Zweige abbrechen.

Ein weiteres Problem mit svn externals ist, dass wenn Sie eine svn: log auf der Stammebene tun, Sie keine Änderungen von Svn Externals sehen.

Hoffentlich eines Tages Svn Externals behoben werden, um die oben genannten Probleme anzugehen, aber bis zu diesem Tag Verzweigung und Svn: Externals ist ein absoluter Albtraum.

+0

Ich stimme dem zu. Wenn die Projekte in separaten Repositorys gespeichert werden, ist es schwieriger, Code freizugeben und bei Bedarf Änderungen zwischen den Produkten vorzunehmen. Das Arbeiten in separaten Projektbereichen ist sauberer, da Sie unabhängig arbeiten können, aber dennoch Änderungen im Stamm vornehmen können. –

+0

Einverstanden; Wir haben ein separates Repo für jedes Projekt und es verursacht Probleme. Wir haben mit mehreren Projekten pro Repo experimentiert und es hat besser funktioniert; Das wichtigste, was uns daran hindert, dauerhaft auf diese Seite zu migrieren, sind Berechtigungen. (commit-access-control.pl ist nicht sehr konfigurierbar, während Sie separate Repositories mit einem LDAP-Modul mit Apache oder ähnlichem steuern können. Wir können auch selektiv bestimmte Repositories für den externen Zugriff verfügbar machen. Es gibt wahrscheinlich einen neueren/besseren Weg Mach das alles, aber für den Moment verwenden wir separate Repos.) – leander

+0

Ya ich benutze Apache und konfiguriere es so, es gibt einen Thread über SO darüber http://stackoverflow.com/questions/484499/how-do-i-restricte-apache-svn-access-to-spezifische-users-ldap-file-based-authentica/484721 # 484721 –

1

zu „setzen alle Projekte in demselben Stamm“:

Aus meiner Erfahrung ist dies keine gute Idee - denn jedes Projekt seine eigene Geschichte und Veränderungen hat und oft Projekte/wird von verschiedenen Entwicklern gepflegt werden. Dies kann zu Konflikten führen - auch wenn Sie feststellen, dass sich die Projekte derzeit stark stören.

Warum verwenden Sie also keine allgemeinen Tags (mit Meilensteinen als Namen) für all Ihre Projekte, um die gleiche Code-Basis und ein Build-Skript zu erhalten, das die Projekte (Trunks) automatisch auschecken kann? Es ist mehr Arbeit, aber wie bei OOP (Kapselung) üblich würde ich die Projekte lieber in separate SVN-Verzeichnisse aufteilen.

Aber: Ein paar kleine libs und apps in einem gemeinsamen Verzeichnis unter dem gleichen Stamm zu sammeln ist kein Problem (siehe "apps" und "tools" in meinem Beispiel) - so können vielleicht "kleine Projekte" in der geteilter/großer Kofferraum.

Hier als Beispiel meiner Verzeichnisstruktur von SVN:

/projects/ 
/projects/CustomerA/ 
/projects/CustomerA/ProjectX/ 
/projects/CustomerA/ProjectX/trunk/ 
/projects/CustomerA/ProjectX/tags/ 
/projects/CustomerA/ProjectX/branches/ 
/thirdparty/ 
/thirdparty/ExtLibY/ 
/thirdparty/ExtLibZ/ 
/tools/ 
/tools/trunk/ 
/tools/tags/ 
/tools/branches/ 
/apps/ 
/apps/trunk/ 
/apps/tags/ 
/apps/branches/ 

Also alles von der externen Sache in/Dritter gespeichert/und alle Einbauten (Projekte, Tools, Apps) die subdirs:

/trunk/ 
/tags/  
/branches/ 

... wie im Subversion-Buch und dem vorherigen Post empfohlen.

Auch wenn das auf den ersten Blick etwas anstrengend aussieht - es lohnt sich wirklich, besonders wenn die Codebasis wächst.

ciao, Chris

+0

Wir verwenden ungefähr das gleiche Layout. Wir verwenden Projekte (intern), Produkte (geliefert) und Bibliotheken (wiederverwendete Komponenten) als Top-Level-Namen. –

1

Haben Sie einige ernsthafte Probleme sehen wir können mit dieser Lösung?

  • Ihre Lösung funktioniert nur so lange, wie Sie alles in einem einzigen Repository setzen können.

    Dies bedeutet, dass das gesamte Repository auf absehbare Zeit auf einen einzelnen Datenträger (oder Speicherpool) passen muss. Ähnliche Überlegungen gelten für andere Serverressourcen wie Netzwerk- und Festplatten-E/A-Bandbreite.

    Wenn Sie das Repository später splitten, müssen Sie Ihr gesamtes Setup gründlich überarbeiten. Dies kann zu Problemen führen, wenn alte Versionen neu erstellt oder verzweigt werden müssen.

  • Ihre Lösung nur, wenn Sie auf einer Per-User-Basis

    Wenn Sie/Schreibberechtigung Sie tatsächlich für projectA, lesen geben müssen Lese-/Schreibberechtigungen nicht funktioniert müssen begrenzen werden müssen um die Berechtigung für/trunk/projectA und/branch1/projectA und/branch2/projectA usw. zu geben.

    Die Verzweigung wird dann zu einem schwergewichtigen Prozess, der viel Feinabstimmung erfordert. Verabschieden Sie sich von feature branches.