Außerhalb der Uhr werde ich versuchen, eine Strategie für die Versionskontrolle für mein Unternehmen zu entwickeln. Wir verwenden derzeit SVN, aber es gibt keine Struktur - wir haben im Grunde nur einen Trunk und verpflichten uns nur dazu. Vor kurzem hat der Entwicklungsmanager ein zweites Repository gestartet, das als "Tag" fungiert. Es muss jedoch manuell mit dem "Trunk" zusammengeführt werden, da es nicht Teil desselben Repositorys ist, sondern ein völlig separates. Tatsächlich gibt es nur einen Ordner mit dem Namen "Dev" (es gibt tatsächlich verschiedene "Dev" -Ordner zu unterschiedlichen Daten, aber nur "Dev" ist der Hauptordner) und darunter befindet sich alles andere. alle anderen Projekte. Es ist überhaupt nicht nach Projekten organisiert, es gibt kein Konzept für Zweige / Tag / Stamm oder irgendetwas. Die Person, die es ursprünglich eingerichtet hat (längst vorbei, natürlich) schien überhaupt nicht zu wissen, wie man SVN einrichtet, und seitdem hat sich niemand die Mühe gemacht, zu lernen, wie man Dinge richtig macht, aus Angst, etwas zu zerbrechen. Wir verwenden keinerlei CI (oder leider automatisierte Tests).
Erstens, sollten wir es nach Projekten trennen lassen? Zum Beispiel haben wir: Zwei ASP.NET-Websites (nicht Webanwendungen, Websites), einen Webdienst, einen Bereitstellungsordner für alle Tabellenskripte und gespeicherten Prozeduren, zwei Befehlszeilenclients für externe Projekte, die von der aufgerufen werden Websites und ein freigegebener Ordner mit gemeinsamen Geschäftsobjekten und dergleichen. Sollte jedes dieser Projekte ein eigenes Projekt mit einem Branch / Tag / Trunk-Setup sein oder sollte es so aussehen:
dev/
branches/
tags/
trunk/
Site1/
Site2/
WebService/
SharedCode/
und haben alle Zweige und alles eine Kopie des gesamten Dev-Ordners? Dieser Ansatz ist möglicherweise leichter zu schlucken, da wir häufig Situationen haben, in denen wir Änderungen an der gemeinsam genutzten Codebibliothek und an mindestens einer (normalerweise beiden) der Websites vornehmen müssen.
Zweitens machen wir regelmäßige Releases ("Pushs" in unserer Sprache) auf unserem Dev-Server und Live-Server. Nach dem, was ich gelesen habe, würde der beste Weg, dies zu handhaben, darin bestehen, dass die gesamte Entwicklung in Trunk / geht, Zweige "temporär" sind und zum Hinzufügen einer neuen Funktion verwendet werden, die sich auf Trunk auswirken könnte, und Tags für Releases vorgesehen sind. Also, wir pushen jeden Monat, sagen wir, und ich arbeite an einem brandneuen Modul. Ich würde Trunk verzweigen und diesen Zweig für meinen Code verwenden, ihn schreiben und testen und was auch immer. Wenn das Modul fertig ist, füge ich es wieder in den Trunk ein (und lösche möglicherweise den Zweig), und wenn wir bereit sind, es bereitzustellen, markieren wir es (sagen wir "May2011"). Wenn wir einen Bugfix haben, nachdem er live geschaltet wurde, wird er im May2011-Tag behoben und in Trunk zusammengeführt (damit Trunk auch den Fix erhält). und dann würde May2011 mit dem Fix wieder rausgeschoben? Ist dies die Absicht des Markierens?
quelle
Antworten:
Wenn Sie einen einheitlichen Erstellungsprozess wünschen, müssen Sie Zweige / Tags / Trunk wie folgt im Stammverzeichnis platzieren:
Wenn Sie keinen einheitlichen Erstellungsprozess benötigen, können Sie Zweige / Tags / Amtsleitungen in jedes Projekt einfügen, wenn Sie möchten. Es kann jedoch schwierig sein, zu einem einheitlichen Build zu migrieren, nachdem Sie sie in jedes Projekt eingefügt haben. Ein einheitlicher Build bietet Vorteile, z. B. die Notwendigkeit, gemeinsam genutzte Komponenten in Projekten zu veröffentlichen - sie sind alle Teil des Builds.
Persönlich mag ich einen einheitlichen Erstellungsprozess. Außerdem denke ich nicht, dass Sie ein "Entwickler" -Projekt haben sollten. Sie sollten Projekte direkt unter Trunk haben und dann Trunk in einen Dev-Zweig verzweigen. Verwenden Sie Tags für Releases. Zum Beispiel würde ich es so machen:
quelle
Ich würde vorschlagen, dass die Projekte, wenn sie verwandt sind oder Code gemeinsam nutzen, einen gemeinsamen Trunk wünschen. Wenn sie unabhängig sind, möchten sie separate Amtsleitungen oder sogar separate Repositorys. Wenn Sie einem Dritten jemals eine Kopie des SVN-Verlaufs für ein Projekt zur Verfügung stellen müssen, ist es viel einfacher, wenn es sich in einem separaten Repository befindet.
In Ihrem Fall klingt das oben skizzierte Layout also vernünftig, da Sie gemeinsam genutzten Code haben und möchten, dass Zweige / Tags diesen gemeinsam genutzten Code enthalten.
Persönlich würde ich auch die Einschränkung hinzufügen, dass alles, was für den Kofferraum bestimmt ist, gebaut werden muss, atomar sein muss und keine Komponententests brechen sollte. Zweige sind für unfertige Arbeiten in Arbeit. Ich würde erwarten, dass der Kofferraum zu jedem Zeitpunkt ein potenzieller Release-Kandidat ist.
quelle
Das Folgende ist der beste Weg, um ein Subversion-Repository zu erstellen
Auf diese Weise können Sie einzelne Projekte selbst überprüfen.
Wenn Sie alle drei Projekte auschecken und einen einheitlichen Build mit einem monolithischen Build-Skript / System erstellen möchten, untersuchen Sie dies mithilfe eines Master- Moduls mit svn: externals, das alle anderen Projekte dem Master zuordnet
trunk
.Dies ist auf den ersten Blick komplizierter, aber es ist der am besten zu wartende und idiomatischste Weg, um dieses Problem mit Subversion zu lösen.
quelle