Frage

Meine Kollegen und ich streiten uns über den Wert und die Verwendung von Tags in Release-/SCM-Systemen.Wir bitten die StackOverflow-Community um ihre Meinung, um uns bei der Lösung des Problems zu helfen.

Die eine Seite behauptet, dass Tags eine wertvolle Ergänzung zum Release-Management seien.Ein Beispiel für ihre Verwendung:Wir machen eine Maven-Version, die ein neues Tag (nennen wir es 1.0) erstellt, das ein Code-Snapshot ist, der für diese Version verwendet wird.Dieses Tag sollte ein READONLY-Zweig sein.Wenn ein Fehler behoben werden muss, können wir eine Kopie des Tags in einen neuen Zweig erstellen (nennen Sie ihn 1.1).Fehlerbehebungen gehen dorthin.Diese Korrekturen können wieder in Trunk zusammengeführt werden, sodass der Hauptentwicklungszweig die Fehlerkorrekturen erhält.Schließlich wird 1.1 veröffentlicht und automatisch ein Tag 1.1 erstellt.Dieser Zyklus geht weiter.Der Hauptvorteil des Tags besteht darin, dass Sie, wenn Sie aus irgendeinem Grund jemals Version 1.0 erneut veröffentlichen müssen, Tag 1.0 einfach mit der Gewissheit veröffentlichen können, dass es von niemandem geändert wurde.Außerdem ist die Aussage „Release Tag 1.0“ sauberer als die Aussage „Release Revision 1 von Zweig 1.0, bei der es sich um die ursprüngliche Version 1.0 ohne die Korrekturen handelt“.

Die andere Seite behauptet, dass Tags keinen wertvollen Nutzen bringen, insbesondere in einem System wie Subversion mit globalen Revisionen, die wie ein Tag in CVS wirken.Außerdem gibt Subversion nur eine Warnung aus, wenn ein Tag festgelegt wird.es stoppt es nicht wirklich.Ihre Methode wird in Trunk entwickelt und bei der Veröffentlichung würden Sie einen Zweig namens 1.0 erstellen.Sie würden die Fehlerkorrekturen in Trunk fortsetzen und wenn Sie diese Fehlerkorrekturen erneut für die Produktion veröffentlichen müssten, würden Sie sie in 1.0 Branch zusammenführen und 1.0 erneut veröffentlichen.Irgendwann, vielleicht nach größeren Korrekturen oder Funktionen in Trunk, würden Sie Branch 1.1 veröffentlichen und erstellen.Der Zyklus geht weiter.Wenn Sie jemals die Originalversion 1.0 veröffentlichen müssen, müssen Sie sich Branch 1.0 Revision 1 ansehen.

Offensichtlich funktionieren beide Methoden.Ich würde gerne die Meinung der Community dazu hören, welche Methode bevorzugt wird und warum.

Bearbeiten:Ich mache mir ein wenig Sorgen, dass der „beste“ Weg vom zugrunde liegenden SCM-System abhängt.Entscheiden Sie sich entweder für Subversion, um Antworten zu erhalten, oder halten Sie es, wenn möglich, SCM-unabhängig.

War es hilfreich?

Lösung

Aus SCM Agnostiker Sicht ein Tag ist sehr verschieden von einer Revision.

Beide können auf die gleiche Art und Weise implementiert werden, stellt sowohl eine „Zeitlinie“, aber ihr Ziel ist es anders:

  • ein Tag stellt einen unveränderlich Zustand, in dem alle Dateien durch eine eindeutige ID referenziert werden. Es ist ein Name stellvertretend für viele Dinge sondern vor allem ein stabiler Zustand, ...)
  • eine Revision stellen eine Transaktion commit ( nicht alle SCM haben diese , vor allem die alten mit einem ‚Datei-für-Datei-Ansatz‘). Alle Commits stellen keinen „stabilen“ Zustand (wie in „Übersetzen“ oder „Ausführen“ erfolgreich). Sie sind nur ein neues Element der globalen Geschichte.

Das Problem mit SVN ist, dass Revision, Tag und Zweige sind alle implementiert gleich.
Aber ich würde immer noch die Option vorziehen, wo ein Tag als verwendet wird "read-only" Zweig .

Andere Tipps

Meiner Meinung nach Tags sind nützlich. Es wird des Projekts im Leben irgendwann mal sein, dass man auf einen Fehler oder eine Änderung kommen und Sie wollen wissen, ob es dort in einer früheren Version war. Es wird Gründe sein, um Code von einem Release zu einem anderen zu vergleichen, der Effizienz zu messen sowohl in Leistung und tatsächlich die Entwicklung des Codes.

Sicher, es gibt eine Chance, dass Sie es vermasseln können, aber es kann immer wieder rückgängig gemacht werden. Es gibt wirklich keinen Grund, nicht zu, und es gibt mehrere Gründe, warum es in der Zukunft nützlich sein könnte. Für mich ist es ein no-brainer.

Ich bin damit einverstanden, dass Sie auch Zweige verwenden sollen und Ihre Entwicklung dort zu tun, aber immer wenn Sie tatsächlich etwas loslassen, um einen Tag daraus machen.

Ja, Sie möchten Tags verwenden.

Stellen Sie sich ein Tag lediglich als Bezeichnung oder Namen für eine bestimmte Revision vor.Meiner Erfahrung nach ist es sehr hilfreich, wichtige Meilensteine ​​in einem Projekt zu markieren, sei es für die Produktionsfreigabe oder sogar für vorläufige QA-Freigaben.Oft möchten Sie in die Vergangenheit reisen und sich den Quellcode einer bestimmten Version ansehen.

Wenn Sie bei der Veröffentlichung eine Verzweigung durchführen, können Sie jederzeit herausfinden, welche Revision für die Produktion freigegeben wurde. Dies ist jedoch etwas mühsam im Vergleich zum bloßen Betrachten eines Tags.Wenn Sie keine Release-Branches verwenden, kann es leicht passieren, dass Sie den Überblick darüber verlieren, welche Revision zum Erstellen eines bestimmten Builds verwendet wurde.

Das Problem mit svn besteht darin, dass es die Unterscheidung zwischen Tags und Branches verwischt.Jeder kann sich immer auf ein Tag festlegen, es kann also nicht garantiert werden, dass es fest/unveränderlich ist.In anderen VCS wie PVCS ist ein „Tag“ unveränderlich.Sie können eine Teamkonvention übernehmen, um Festschreibungen für Tags zu verhindern, oder vielleicht sogar Festschreibungs-Hooks verwenden, um Festschreibungen für Tags zu verhindern.

Wir verwenden Tags (Etiketten), wenn neue Basislinien zu schaffen. Wir tun es einmal in der Woche, aber einige Teams tun es sogar mehrmals am Tag.

Der Punkt (für uns) immer sicherstellen, dass die neue Basislinie stabil ist: es ist also nicht nur ein zu bauen, ist ein Build, den die gesamte Testsuite geht, mehr Stunden von automatisierten Tests und möglicherweise manuell Sondierungs diejenigen zu

Dann wird die Basislinie als Ausgangspunkt für alle Aufgaben, die während der nächsten Iteration verwendet: Jede neue Aufgabe ist eine Niederlassung von den Ausgangspunkten, die so stabil zu sein, sind bekannt, was auch immer in der Task gebrochen wird, sollte innerhalb leicht zu verfolgen die Aufgabe selbst.

Normalerweise zeigen wir nur Tags (Etiketten) auf dem Hauptzweig (oder Stamm oder Master auf Ihrem SCM Geschmack abhängig), das ist der Integrationspunkt für alle anderen Branchen.

Wenn wir lösen ein offizielles Produkt, das wir einen erstellen „Release-Zweig für sie“ so wird es nur Fixes erhalten, während neue Entwicklung bleibt auf „main“. Dann werden diese „Wartungs Zweige“ (hoffentlich nur ein oder zwei auf einmal) zu markiert werden kann.

Ich mag über Tags als „nur ein ausgefallener Name für eine Revision“ denken. Ich habe immer über sie dachte, dass die Art und Weise, und IIRC in Mercurial sie sind genau das. aber in Subversion, wie Sie sagen, sie sind in der Tat (billig) Kopien von trunk / * tags / fancy-name /

Ehrlich gesagt, würde ich die beiden Strategien für optimale Ergebnisse kombinieren: Tag und Filiale bei der Freigabe. Ihr Tag ist 1.0.0, Zweig 1.0-MAINT genannt. Fehlerbehebung gehen in Zweige und Bugfix-Releases sind die Tags wieder (1.0.1 kann von einem Tag sollte 1,0-MAINT an einem bestimmten Punkt an Alias).

Vergessen Sie jedoch nicht, dass Tags und Niederlassungen in Subversion sind eigentlich das Gleiche: billige Kopien. Der einzige Unterschied zwischen ihnen ist die Semantik Sie / Ihr Team zu ihnen Attribute, so dass es kocht ziemlich nach unten, um Menschen immer auf einem particualr Verfahren zu vereinbaren und dabei bleiben (möglicherweise auf dem Server erzwungen werden, zB Commits in Tags disallowing / except für die Freigabe Koordinatoren usw.).

Das Problem habe ich allerdings mit dem zweiten Ansatz zu sehen ist: Wie wollen Sie eine einfache Unterscheidung zwischen Software im Bereich machen, wenn Sie 1.0 Re-Release? Das bedeutet, dass Sie zu einer anderen Codebasis ein 1,0 und ein weiteren 1,0 tatsächlich beziehen können ....

Immutable Schnappschüsse eines Quellcodes des Projektes (und ausführbar) sind von unschätzbarem Wert für die Prüfung jeglicher Art zu tun, ob Anwendungstests oder Feld strukturiert. Bei strukturierten Tests, Sie gehen Daten zu erstellen, die Monate oder Jahre in der Zukunft verwiesen werden könnte. Jedes Mal, wenn diese Daten erneut, Murphy Gesetz sagt, Sie müssen wissen, welcher Code er kommt und wenn Sie sich die Mühe gehen eine bestimmte Momentaufnahme des Quellcodes unter Berufung auf, wird es unmöglich sein, mit Vertrauen zu sagen, welche Quellcode entsprach dass Testdaten.

Ich kann Ihnen nicht sagen, wie oft jemand zu mir gekommen ist und sagte: „Dieser Mikrocontroller-Code nicht funktioniert, kann Ihnen helfen?“ und ich frage sie: „Welche Version verwenden Sie?“ und sie sagen: „Ich bin mir nicht sicher“, weil sie nicht gut Release-Management zu tun (zumindest einen Aufkleber setzen auf dem Gerät, bessere Informationen zu setzen in EEPROM Versionierung, die in Echtzeit abgefragt werden kann). >: (

In SVN, der technischen Unterschied zwischen einem Tag verwenden und eine Revision Tracking ist gleich Null. Ich finde ich Verwendung minimiert Tag auf, wie SVN-Implementierung ist einfach eine billige Kopie und clutters Ihren „Strukturraumes“.

Der wirkliche Unterschied kommt, wenn Kommunikation eine bestimmte Baseline zu einem großen Team von Entwicklern. Revision Tracking bringt eine zusätzliche Abstraktionsschicht, die eine Fehlerquelle werden kann. Und wie wir alle wissen, sind, wenn Sie mit 50 + Entwickler zu tun hat, wird jede Fehlerquelle ein Bereich, der Verwirrung geworden und verschwendet Zeit. Ein ausführlicher Tag, das Verwirrung beseitigen und entfernen Sie alle Zweifel darüber, was ein Baseline Zweck ist.

Ich würde beide Ansätze kombinieren. Jedes Mal, wenn Sie ein Release machen, markieren sie. Tags sollten sich nie ändern, so das Vorhandensein eines „1.0.0“ Tag ist ein Indikator, dass Sie sollten nicht versuchen, irgendetwas anderes als 1.0.0 zu veröffentlichen.

Zur gleichen Zeit, als die Zeit kamen 1.0.0 zu tun, würde ich es auf einen 1,0 Zweig setzen. So ist die Strömung: Zweig Stamm bis 1,0, markieren diese neue 1.0 als 1.0.0, und bereitstellen. Dann Fehlerkorrekturen können auf dem 1,0 Zweig erfolgen (zur Vermeidung von mit jeder 1.1-targetted Entwicklung verwechselt zu werden, die bereits auf Stamm jetzt sein können) und verschmolzen zu Stamm. Jede Version der festen 1.0 ist als 1.0.x aus dem 1,0 Zweig markiert. Dies ist im Grunde der Ansatz, den wir bei der Arbeit mit Perforce verwenden, und das ist sehr ähnlich in der Tat zu Subversion. (Durch die Antworten Lesen, ich denke, es zu Vincents Empfehlung nahezu identisch ist)

Was den Kommentar zu Tags redundant, weil Sie Revisionsnummern haben --- das ist weitgehend wahr, mit der Ausnahme, dass die Tags auch einen Bereich angeben: das heißt, die im Repository-Dateien werden von dem Tag bedeckt. Sie können vernünftigerweise jemanden fragen zu /svn/proj1/tag/1.0.0 suchen und sie sind ab sofort zu einem kohärenten Arbeitsplatz suchen. Wenn man sie fragt, in Revision X zu suchen, müssen sie zunächst einen Blick auf Revision X zu sehen, dass es veränderte (sagen wir) / svn / proj1 / trunk / Makefile und damit, dass ableiten / svn / proj1 / trunk / @ X ist, was sie sollten bei der Suche werden. Was passiert, wenn Revision X Dateien in proj1 und proj2 berührt? Das ist natürlich böse, aber streng genommen Sie sagen / svn / proj1 / trunk / @ X werden sollte. Und wo wird die Liste der Revisionsnummern gespeichert? Wie können wir wissen, dass 1.0.0 Revision X? Es sollte möglich sein, dass IMHO zu bestimmen, nur aus dem Repository.

Bei Systemen wie Git, Tags und Zweige sind immer noch im Grunde das Gleiche (nur Verweise auf die Objektdatenbank), aber die Konvention ist, dass Tag-Refs ändern sich nicht, und Zweig Refs tun ( und vorzugsweise mit einer spezifischen Einschränkung, wie sie ändern). Notgedrungen auch „Etiketten“, die Art und Weise der Gruppierung einen Satz von Dateiversionen gemeinsam unabhängig von einer Änderungsliste; die im wesentlichen ein Tag ist, aber eher verwirrend: historisch haben wir verwendet Änderungsnummern (äquivalent zu Subversion Revisionsnummern) mit dem Namen der Branche qualifiziert sie sein sollten Versionen zu identifizieren. Die beiden sind eine Möglichkeit, nahezu identisch, so dass hier ich TMTOWTDI erraten.

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