Frage

Ich habe gesehen, diese Wörter viel rund um Subversion (und ich denke, Allgemeines repository) Diskussionen.Ich habe mit SVN für meine Projekte der letzten Jahre, aber ich habe nie Begriffen, das komplette Konzept für diese Verzeichnisse.

Was bedeuten Sie?

War es hilfreich?

Lösung

Hmm, nicht sicher, ich Stimme mit Nick wieder tag wird ähnlich wie ein Zweig.Ein tag ist nur eine Markierung

  • Trunk wäre der Hauptteil der Entwicklung, ausgehend vom start des Projekts bis in die Gegenwart.

  • Branch wird eine Kopie des Codes, abgeleitet von einem bestimmten Punkt in dem Stamm, der für die Anwendung wichtigen änderungen am code, wobei die Integrität des Codes in den Kofferraum.Wenn die wichtigsten änderungen, die arbeiten nach plan, Sie sind in der Regel zusammengeführt zurück in den Kofferraum.

  • Tags wird ein Punkt in der Zeit, die auf den Stamm oder einen Zweig, den Sie beibehalten möchten.Die zwei wichtigsten Gründe, die für die Erhaltung wäre, dass entweder das ist ein major-release der software, ob alpha, beta, RC oder RTM, oder diese ist die meisten stabile Punkt der software, bevor Sie wichtige änderungen auf dem Stamm angewendet wurden.

Im open-source-Projekte, die großen Zweige, die sind nicht akzeptiert in den Kofferraum, indem Sie die Projekt-Stakeholder werden können, die Grundlage für Gabeln -- z.B., völlig getrennte Projekte, die einen gemeinsamen Ursprung mit anderen source-code.

Die Zweig-und tag-teilstrukturen unterschieden werden, die aus dem Stamm in die folgenden Möglichkeiten:

Subversion erlaubt es Systemadministratoren erstellen hook-scripts die sind ausgelöst zur Ausführung, wenn bestimmte Ereignisse auftreten;zum Beispiel, Begehen, eine änderung an das repository.Es ist sehr Häufig für ein typisches Subversion-repository-Implementierung zu behandeln, jeder Pfad mit "/tag/" zu schreiben-geschützt nach Erstellung;das Ergebnis ist, dass-tags, einmal erstellt, sind unveränderlich (zumindest zu "normalen" Benutzer).Dies geschieht über die hook-Skripte, die für die Durchsetzung der Unveränderlichkeit durch die Verhinderung weiterer änderungen, wenn Tags ist ein übergeordneter Knoten des geänderten Objektes.

Subversion hat auch zusätzliche features, seit der version 1.5, die sich auf "branch merge-tracking", so dass änderungen verpflichtet zu einem branch zusammengefasst werden können, zurück in den Stamm mit Unterstützung für inkrementelle, "smart" miteinander zu verschmelzen.

Andere Tipps

Erstens, wie @AndrewFinnell und @KenLiu darauf hin, im SVN Verzeichnis-Namen selbst bedeuten, nichts - "Stamm, Zweige und tags sind einfach eine Allgemeine Konvention, wird von den meisten repositories.Nicht alle Projekte, alle Verzeichnisse (es ist einigermaßen üblich, nicht die Verwendung von "tags" an alle), und in der Tat, nichts hindert Sie, nannte Sie alles, was Sie möchten, aber brechen Konvention ist oft verwirrend.

Ich werde beschreiben, wahrscheinlich das häufigste Szenario für den Einsatz von Zweigen und tags, und geben Sie ein Beispiel-Szenario, wie Sie verwendet werden.

  • Trunk:Die wichtigsten Entwicklungs-Bereich.Dies ist, wo Ihre nächste major release des Kodex lebt, und hat in der Regel die neuesten features.

  • Zweige:Jedes mal, wenn Sie release einer major-version, es wird ein Zweig erstellt.Dies können Sie tun, bug fixes und eine neue Version machen, ohne zu release das neueste - möglicherweise unvollendet oder ungetestet - Funktionen.

  • Tags:Jedes mal, wenn Sie eine version (final release, release Kandidaten (RC), betas) Sie machen einen tag.Dies gibt Ihnen eine point-in-time-Kopie der code, wie es war, in diesem Zustand, so dass Sie zurück zu gehen und die Reproduktion jeglicher Fehler, wenn notwendig, eine frühere version oder ein re-release eine frühere version genau so, wie es war.Zweige und tags in SVN sind leicht - auf dem server, es muss nicht eine vollständige Kopie der Dateien, nur eine Markierung sagte: "diese Dateien kopiert wurden bei dieser revision", dass dauert nur ein paar bytes.Mit diesem im Verstand, sollten Sie nie werden besorgt, erstellen Sie ein tag für alle veröffentlichten code.Wie ich bereits sagte, tags werden oft weggelassen und stattdessen ein changelog oder andere Dokument verdeutlicht die revision-Nummer, wenn Sie eine Freigabe aus.


Für Beispiel, lassen Sie sagen, dass Sie ein neues Projekt beginnen.Sie beginnen mit der Arbeit in den "Stamm" auf, was schließlich mit der Freigabe von version 1.0.

  • trunk/ Entwicklung die version, die bald 1.0
  • branches/ leer

Einmal 1.0.0 abgeschlossen ist, werden Sie Zweig Stamm in ein neues "1.0" Zweig, und erstellen Sie eine "1.0.0" - tag.Nun, was schließlich 1.1 setzt sich in den Kofferraum.

  • trunk - / - Entwicklung-version, bald werden 1.1
  • branches/1.0 - release-version 1.0.0
  • tags/1.0.0 - release-version 1.0.0

Kommen Sie über einige bugs in die code, und fixieren Sie Sie in den Stamm, und führen Sie die Updates über die 1.0-Zweig.Sie können auch das Gegenteil tun, und beheben Sie die Fehler in der 1.0-Zweig und dann fahren Sie zurück zum Stamm, aber Häufig Projekte-stick mit der Zusammenführung one-way-nur zu vermindern die chance, etwas zu verpassen.Manchmal ein Fehler kann nur behoben werden, in 1.0, weil es veraltet ist im 1.1.Es ist nicht wirklich wichtig:Sie möchten nur sicherstellen, dass Sie nicht release 1.1 mit den gleichen bugs, die behoben wurden in 1.0.

  • trunk/ Entwicklung die version, die bald 1.1
  • branches/1.0 - kommende 1.0.1 release
  • tags/1.0.0 - release-version 1.0.0

Sobald Sie genug Fehler (oder vielleicht auch einer kritischen bug), Sie entscheiden zu tun, ein release 1.0.1 herauszugeben.So machen Sie einen tag "1.0.1" aus der 1.0-Zweig, und lassen Sie die code.An diesem Punkt, Stamm enthalten, was sein wird, 1.1, und der "1.0" - Zweig enthält 1.0.1 code.Das nächste mal, wenn Sie release ein update auf 1.0, es wäre 1.0.2.

  • trunk/ Entwicklung die version, die bald 1.1
  • branches/1.0 - upcoming release 1.0.2
  • tags/1.0.0 - release-version 1.0.0
  • tags/1.0.1 - 1.0.1-release-version

Schließlich sind Sie fast bereit zu release 1.1, aber Sie wollen eine erste beta.In diesem Fall haben Sie wahrscheinlich ein "1.1" - Zweig und einen "1.1beta1" - tag.Nun, was wird 1.2 oder 2.0 vielleicht) auch weiterhin im Kofferraum, aber die Arbeit auf 1.1 ist weiterhin in der "1.1" Branche.

  • trunk - / - Entwicklung-version, bald werden 1.2
  • branches/1.0 - kommende release 1.0.2
  • branches/1.1 - kommende Version 1.1.0
  • tags/1.0.0 - release-version 1.0.0
  • tags/1.0.1 - 1.0.1-release-version
  • tags/1.1beta1 - 1.1 beta 1 release-version

Sobald Sie Version 1.1 final, Sie tun ein "1.1" tag aus "1.1" Branche.

Sie können auch weiterhin zu pflegen, 1.0, wenn Sie möchten, die Portierung von bug-fixes, die zwischen allen drei Filialen (1.0, 1.1 und Rumpf).Das wichtigste zum mitnehmen ist, dass für jede Hauptversion der software, die Sie pflegen, haben Sie ein Zweig, enthält die neueste version von code für diese version.


Eine andere Verwendung der Filialen für features.Dies ist, wo Sie Zweig Stamm (oder eine Ihrer release-Zweige) und die Arbeit an einem neuen feature in der isolation.Sobald die Funktion abgeschlossen ist, führen Sie Sie wieder ein und entfernen Sie den Zweig.

  • trunk/ Entwicklung die version, die bald zu werden 1.2
  • branches/1.1 - kommende Version 1.1.0
  • branches/ui-rewrite - experimentellen Zweig

Die Idee dabei ist, wenn Sie an etwas arbeiten, das störende (die halten würde, oder stören mit anderen Menschen zu tun, Ihre Arbeit), etwas experimenteller (, dass kann nicht machen es sogar in), oder vielleicht einfach etwas, das dauert eine lange Zeit (und du hast Angst, wenn es hält ein 1.2-release, wenn Sie bereit sind, Niederlassung 1.2 vom Stamm), können Sie es tun in der isolation in die Filiale.In der Regel, Sie halten es bis zu Datum mit dem Stamm durch das Zusammenführen von änderungen in all der Zeit, die macht es einfacher zu re-integrieren (merge zurück zu trunk), wenn Sie fertig sind.


Beachten Sie auch die Versionierung-Schema habe ich hier, ist nur eine von vielen.Einige teams tun würde, Fehler beheben/Wartung releases 1.1, 1.2, etc., und große Veränderungen als 1.x, 2.x, etc.Die Verwendung hier ist die gleiche, aber Sie können den Namen der Filiale "1" oder "1.x" anstelle von "1.0" oder "1.0.x".(Beiseite, semantische Versionierung eine gute Anleitung, wie man die Versionsnummern).

Zusätzlich zu dem, was Nick gesagt hat, Sie finden Sie mehr unter Gestreamt Linien:Branching Patterns for Parallel Software Development

enter image description here

In dieser Abbildung main ist der Kofferraum, rel1-maint ist ein Zweig, und 1.0 ist ein tag.

In Allgemeinen (tool-agnostic view), ein Zweig ist der Mechanismus, der für die parallele Entwicklung.SCM kann von 0 bis n Zweige.Subversion ist 0.

  • Trunk ist ein Haupt-Zweig empfohlen durch Subversion, aber Sie sind in keiner Weise gezwungen, es zu schaffen.Man könnte Sie als 'Haupt -' oder 'releases', oder nicht an allen!

  • Branch eine Entwicklung darstellt Aufwand.Es sollte nie benannt nach einer Ressource (wie "vonc_branch') aber nach:

    • ein Zweck 'myProject_dev' oder 'myProject_Merge'
    • ein release-Umfang 'myProjetc1.0_dev ' or myProject2.3_Merge' oder 'myProject6..2_Patch1'...
  • Tags ist der Schnappschuss-Dateien, um einfach wieder zu diesem Zustand.Das problem ist, dass tag-und-Branche ist die gleiche in Subversion.Und ich würde definitiv empfehlen, der paranoide Ansatz:

    Sie können eine access-control-Skripte mit Subversion zu verhindern, dass jemand von etwas zu tun, sondern die Schaffung neuer Exemplare in den tags-Bereich.

Ein tag ist endgültig.Ihr Inhalt sollte sich nie ändern.NIE.Je.Haben Sie vergessen, eine Zeile in der release-note?Erstellen Sie ein neues tag.Veraltete oder entfernen Sie die alte.

Nun, ich lese viel über "die Zusammenlegung wieder so und so so und so die Zweige, dann schließlich in den Stamm Zweig"., Das heißt merge-workflow und es ist zu nichts verpflichtend hier.Es ist nicht, weil Sie eine trunk-Zweig, Sie haben, Zusammenführen zurück alles.

Durch die Konvention, den trunk-Zweig repräsentieren den aktuellen Status der Entwicklung, aber das ist für einen einfachen sequenziellen Projekt, das ein Projekt hat:

  • keine 'im Voraus' Entwicklung (für die Vorbereitung der nächsten kommenden version implizieren solche änderungen, die Sie sind nicht kompatibel mit der aktuellen 'trunk' Entwicklung)
  • keine massive refactoring (für das testen einer neuen technischen Wahl)
  • keine langfristige Wartung von einer früheren Version

Denn mit einem (oder allen) dieser Szenario, Sie Holen sich vier 'trunks', vier "aktuellen Entwicklungen", und nicht alles, was Sie tun, in die parallel-Entwicklung notwendigerweise zusammengeführt werden zurück in 'trunk'.

In ein SVN-tag und Zweig sind wirklich ähnlich.

Tags = a definiert Scheibe in der Zeit, in der Regel verwendet für releases

Branch = auch eine definierte Scheibe in der Zeit, die Entwicklung fortsetzen kann, in der Regel verwendet für große version (wie 1.0, 1.5, 2.0, etc, dann, wenn Sie release-tag der Branche.Dies ermöglicht Ihnen, weiter zu unterstützen, eine Freigabe für die Produktion während der Vorwärtsbewegung mit wichtigen änderungen in den Kofferraum

Trunk = Entwicklung Platz zum arbeiten, dies ist, wo alle Entwicklung geschehen soll, und dann die änderungen zusammengeführt wieder von ast-releases.

Sie haben nicht wirklich eine formale Bedeutung.Ein Ordner ist ein Ordner SVN.Sie sind eine allgemein akzeptierte Möglichkeit, Ihr Projekt zu organisieren.

  • Der Stamm, in dem Sie Ihre wichtigsten Linie der developmemt.Die Zweig-Ordner ist, wo Sie erstellen können, sowie äste, die schwer zu erklären in einem kurzen post.

  • Ein Zweig ist eine Kopie einer Teilmenge von Ihrem Projekt, dass Sie nun einzeln aus dem Kofferraum.Vielleicht ist es für Experimente, die vielleicht nicht überall hingehen, oder vielleicht ist es für die nächste Veröffentlichung, die Sie später merge wieder in den Kofferraum, wenn es stabil ist.

  • Und die tags Ordner ist für die Erstellung von tagged Kopien des Repositorys in der Regel auf release checkpoints.

Aber wie ich schon sagte, SVN, ein Ordner ist ein Ordner. branch, trunk und tag sind nur eine Konvention.

Ich bin mit dem Wort 'kopieren' liberal.SVN eigentlich nicht machen, vollständige Kopien der Dinge, die in das repository.

Die trunk ist die Entwicklung der Linie, der hält, was Sie die Letzte Quelle code und Funktionen.Es sollten über die neuesten Updates und die neuesten Funktionen zu dem Projekt Hinzugefügt.

Die Zweige sind in der Regel verwendet, um etwas zu tun Weg von der Stamm (oder eine andere Entwicklungslinie), die sonst Pause build.Neue Funktionen sind oft in einer Filiale und fusionierte dann zurück in den Kofferraum.Zweige oft enthalten code, der nicht unbedingt die Genehmigung für die Entwicklung die Linie verzweigt aus.Beispielsweise könnte ein Programmierer versuchen, eine Optimierung auf so etwas und in der Filiale nur mit merge wieder in die Entwicklung Linie einmal die Optimierung ist zufriedenstellend.

Die tags Momentaufnahmen des Repositorys zu einem bestimmten Zeitpunkt.Keine Entwicklung auftreten sollten auf diese.Sie sind die meisten Häufig verwendet, um eine Kopie von dem, was veröffentlicht wurde, um ein client, so dass Sie können leicht Zugang haben zu dem, was ein client.

Hier ist ein link zu einer sehr guten Anleitung zum repositories:

Der Artikel in der Wikipedia sind ebenfalls lesenswert.

Nun, das ist die Sache, über software-Entwicklung, es gibt kein konsistentes wissen über alles, jeder scheint Sie zu haben es auf Ihre eigene Weise, aber das ist, weil es eine relativ junge Disziplin, die sich sowieso.

Hier ist mein plain einfache Möglichkeit,

trunk - Der Stamm-Verzeichnis enthält die aktuelle, genehmigt und zusammengeführt Körper der Arbeit.Im Gegensatz zu dem, was viele haben gestanden, mein Kofferraum ist nur für saubere, ordentliche, genehmigte und kein Neubaugebiet, sondern ein release-Bereich.

An einen bestimmten Punkt in der Zeit, wenn der Stamm scheint bereit, alle zu befreien, dann ist es markiert und freigegeben.

Zweige - Das Branchen-Verzeichnis enthält Experimente und die Laufenden arbeiten.Arbeit unter einen Zweig bleibt dort, bis Sie zugelassen zu werden, fusionierte in den Kofferraum.Das ist für mich der Bereich, wo alle Arbeit getan ist.

Zum Beispiel:Kann ich haben eine iteration-5 Zweig für eine fünfte Runde der Entwicklung auf dem Produkt, vielleicht ein Prototyp-9 Zweig für eine neunte Runde von Experimenten, und so auf.

tags - Das tags-Verzeichnis enthält snapshots der zugelassenen ästen und Stamm-releases.Wann immer eine Filiale genehmigt, verschmelzen in den Kofferraum, oder eine Freigabe aus dem Kofferraum, eine Momentaufnahme des genehmigten Zweig oder Stamm release unter tags.

Ich nehme an, mit tags kann ich hin und her springen durch die Zeit, um Punkte Interesse ganz einfach.

Ich fand dieses großartige tutorial über SVN, wenn ich war auf der Suche auf den Internetseiten des Autor der OpenCV 2 Computer Vision Anwendung Programmierung Kochbuch-und ich dachte, ich sollte teilen.

Er hat ein tutorial, wie SVN und dem, was die Phrasen 'trunk', 'tag' und 'Filiale' bedeuten.

Zitiert direkt aus seinem tutorial:

Die aktuelle version Ihrer software-Projekt, an dem Ihr team arbeitet derzeit befindet sich normalerweise ein Verzeichnis namens trunk.Wie sich das Projekt entwickelt, die Entwickler-updates, die version die Fehler beheben, neue Funktionen hinzuzufügen) und legt seine änderungen in diesem Verzeichnis.

An jedem beliebigen Punkt in der Zeit, können Sie fixieren möchten, eine version und eine Momentaufnahme der software, wie es ist, in diesem Stadium der Entwicklung.Dieser entspricht in der Regel die offiziellen Versionen Ihrer software, zum Beispiel, diejenigen, die Sie liefern an Ihre Kunden.Diese snapshots befinden sich unter der tags Verzeichnis des Projekts.

Schließlich ist es oft nützlich, um irgendwann eine neue Linie der Entwicklung Ihrer software.Dies geschieht zum Beispiel, wenn Sie testen möchten, eine alternative Implementierung, die in dem Sie haben zu ändern Ihre software, aber Sie wollen nicht, um diese änderungen senden, um die wichtigsten Projekt, bis Sie entscheiden, ob Sie die Einführung des neuen Lösung.Das Haupt-team kann Sie dann weiterhin an dem Projekt arbeiten, während andere Entwickler arbeiten an dem Prototyp.Sie würden diese neuen Linien der Entwicklung des Projektes in ein Verzeichnis namens Zweige.

Das trunk-Verzeichnis ist das Verzeichnis, das Sie wahrscheinlich am besten vertraut, weil es ist verwendet zu halten die neuesten änderungen.Ihre Haupt-Codebasis sollte im Kofferraum.

Das Branchen-Verzeichnis ist für holding Ihre Filialen, was immer Sie sein mögen.

Das tags-Verzeichnis ist im Grunde für die Kennzeichnung eines bestimmten Satzes von Dateien.Sie tun dies für Dinge wie releases, wo Sie wollen "1.0" werden diese Dateien bei diesen Revisionen und "1.1" werden diese Dateien bei diesen Revisionen.Sie in der Regel nicht ändern, tags, sobald Sie gemacht sind.Weitere Informationen zu tags finden Sie unter Kapitel 4.Branching und Merging (in Versionskontrolle mit Subversion).

Einer der Gründe, warum jeder eine etwas andere definition ist, weil Subversion implementiert null Unterstützung für die Zweige und tags.Subversion-der im Grunde sagt: Wir schauten uns an full-featured Zweige und tags in andere Systeme und nicht für nützlich befunden, so dass wir nicht alles umsetzen.Machen Sie eine Kopie in ein neues Verzeichnis mit dem Namen convention statt.Dann ist natürlich jeder frei zu haben leicht unterschiedliche Konventionen.Zu verstehen die Unterschied zwischen eine real tag-und eine bloße Kopie + naming convention siehe den Wikipedia-Eintrag Subversion-tags und Zweige.

Tag = eine definierte Scheibe in der Zeit, in der Regel verwendet für releases

Ich denke, das ist das, was man gewöhnlich mit "tag".Aber in Subversion:

Sie haben nicht wirklich eine formale Bedeutung.Ein Ordner ist ein Ordner zu SVN.

das finde ich eher verwirrend:eine revision control system, die weiß nichts über Zweige oder tags.Aus dem Blickwinkel der Implementierung, denke ich, dass die Subversion der Erstellung von "Kopien" ist sehr klug, aber mir hat das wissen, über es ist, was ich nennen würde eine undichte Abstraktion.

Oder vielleicht ich habe gerade mit CVS viel zu lange.

Ich denke, dass ein Teil der Verwirrung kommt aus dem Unterschied zwischen dem Begriff des tag-und die Umsetzung in SVN.Um ein SVN-tag ist ein Zweig ist eine Kopie.Ändern von tags als falsch und in der Tat-tools wie TortoiseSVN wird Sie warnen, wenn Sie versuchen, Sie zu ändern, etwas mit ../tags/..in die Pfad.

Ich bin mir nicht wirklich sicher, was " tag " ist, aber branch ist eine ziemlich häufige source-control-Konzept.

Im Grunde, ein Zweig ist ein Weg, um die Arbeit an änderungen im code, ohne den Kofferraum.Angenommen, Sie möchten eine neue Funktion hinzufügen, das ist ziemlich kompliziert.Sie möchten in der Lage sein zu prüfen, in Veränderungen, wie Sie Sie machen, aber nicht wollen, es zu beeinflussen, Stamm, bis du fertig bist mit der Funktion.

Zuerst würden Sie erstellen eine Filiale.Dies ist im Grunde eine Kopie des Stamm-die Zeit, die Sie aus der Branche.Würden Sie dann tun alle Ihre Arbeit in der Branche.Vorgenommene änderungen werden in der Branche nicht berührt Stamm, so Stamm ist immer noch verwendbar, anderen zu erlauben, dort weiter zu arbeiten (wie tun bugfixes oder kleine Verbesserungen).Sobald Ihre Funktion ist fertig, du würdest integrieren Sie den Zweig wieder in den trunk.Diese würde bewegen Sie alle Ihre änderungen vom Zweig auf den Stamm.

Es gibt eine Reihe von mustern, die Menschen verwenden Sie für äste.Wenn Sie ein Produkt mit mehreren major-Versionen unterstützt, auf einmal, in der Regel jede Variante wäre ein Zweig.Wo ich arbeite haben wir ein QA-Zweig und einem Produktions-Zweig.Vor der Freigabe, die unseren code für die Qualitätssicherung integrieren wir änderungen zu den QA-Zweig, stellen dann von dort aus.Wenn die Freigabe zu Produktion integrieren wir von der QA-Zweig der Produktion Zweig, so wissen wir, den code in der Produktion ausgeführt wird, identisch zu dem, was QA getestet.

Hier ist die Wikipedia-Eintrag auf den Zweigen, da Sie wahrscheinlich erklären, die Dinge besser können als ich.:)

Für Menschen, die vertraut mit GIT, master in GIT ist äquivalent zu Stamm in SVN.

Zweig-und tag hat die gleiche Terminologie in beiden GIT und SVN.

Trunk :Nach der Fertigstellung von jeder sprint in agiler wir kommen mit einem teilweise paketversandfähige Produkt.Diese Versionen werden aufbewahrt im Kofferraum.

Zweige :Alle parallel-Entwicklungen-codes für jede laufende sprint gehalten werden, der in den Zweigen.

Tags :Jedes mal, wenn wir die Freigabe eine teilweise paketversandfähige Produkt-Art beta-version, wir machen ein tag für Sie.Dies gibt uns die code, die verfügbar war, an diesem Punkt der Zeit, so dass Sie uns zurück zu gehen, zu diesem Zustand, wenn erforderlich, an einem gewissen Punkt während der Entwicklung.

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