Meine Kollegen und ich haben einen Streit über den Wert und die Verwendung von Tags in Release- / SCM-Systemen. Wir schauen uns die StackOverflow-Community an, um ihre Gedanken zu äußern, damit wir das Problem lösen können.
Eine Seite behauptet, dass Tags eine wertvolle Ergänzung zum Release-Management darstellen. Ein Beispiel für ihre Verwendung: Wir machen eine Maven-Version, die ein neues Tag (nennen Sie es 1.0), Code-Snapshot für diese Version verwendet. Dieser Tag sollte ein READONLY-Zweig sein. Wenn ein Fehler behoben werden muss, können wir eine Kopie des Tags in einen neuen Zweig machen (nennen Sie es 1.1). Fehlerbehebungen gehen dorthin. Diese Fixes können wieder in Trunk zusammengeführt werden, so dass der Hauptentwicklungszweig die Fehlerkorrekturen erhält. Schließlich wird 1.1 veröffentlicht und ein Tag 1.1 wird automatisch erstellt. Dieser Zyklus wird fortgesetzt. Der Hauptvorteil des Tags liegt darin, dass Sie, wenn Sie jemals die Version 1.0 aus irgendeinem Grund erneut veröffentlichen müssen, das Tag 1.0 mit der Gewissheit veröffentlichen können, dass es von niemandem verändert wurde. Auch "Release Tag 1.0" zu sagen ist sauberer als "Release 1 von Branch 1.0 zu veröffentlichen, also das Original 1.0 ohne die Fixes".
Die andere Seite behauptet, dass Tags keinen wertvollen Nutzen bringen, besonders in einem System wie Subversion mit globalen Revisionen, die sich wie ein Tag in CVS verhalten. Außerdem gibt Subversion nur eine Warnung aus, wenn ein Tag übergeben wird. es stoppt es nicht wirklich. Ihre Methode entwickelt sich in Trunk und nach der Veröffentlichung würden Sie einen Branch namens 1.0 machen. Sie würden Fehlerbehebungen in Trunk fortsetzen und wenn Sie diese Fehlerbehebungen erneut in der Produktion veröffentlichen müssten, würden Sie sie in 1.0 Branch zusammenführen und 1.0 erneut veröffentlichen. Irgendwann, vielleicht nach großen Korrekturen oder Features in Trunk, würden Sie Branch 1.1 freigeben und machen. Der Zyklus wird fortgesetzt. Wenn Sie jemals die ursprüngliche Version 1.0 veröffentlichen müssen, müssen Sie Branch 1.0 Revision 1 auschecken.
Offensichtlich funktionieren beide Methoden. Ich würde gern die Gedanken der Gemeinschaft darüber hören, welche Methode bevorzugt wird und warum.
Edit: Ich bin ein bisschen besorgt, dass der "beste" Weg vom zugrunde liegenden SCM-System abhängt. Entweder setzen Sie Subversion auf Antworten oder, wenn möglich, behalten Sie SCM Agnostic.
Aus Sicht des SCM-Agnostikers unterscheidet sich ein -Tag stark von einer Revision.
Beide können auf die gleiche Weise implementiert werden, beide stellen eine "Zeitlinie" dar, aber ihr Ziel ist anders:
Das Problem mit SVN ist, dass Revision, Tag und Verzweigungen alle gleich implementiert sind.
Aber ich würde immer noch die Option bevorzugen, wo ein Tag als verwendet wird "schreibgeschützter" Zweig .
Meiner Meinung nach sind Tags nützlich. Es wird irgendwann an einem Punkt im Leben des Projekts vorkommen, dass Sie auf einen Fehler oder eine Änderung stoßen und Sie wissen möchten, ob es in einer früheren Version vorhanden war. Es wird Gründe geben, den Code von einer Version zur anderen zu vergleichen, um die Effizienz sowohl bei der Leistung als auch bei der Entwicklung des Codes zu messen.
Sicher, es gibt eine Chance, dass Sie es vermasseln können, aber es kann immer rückgängig gemacht werden. Es gibt wirklich keinen Grund, nicht, und es gibt mehrere Gründe, warum es in der Zukunft nützlich sein könnte. Für mich ist es ein Kinderspiel.
Ich stimme zu, dass du auch Zweige benutzen und deine Entwicklung dort machen solltest, aber wenn du tatsächlich etwas veröffentlichst, mach ein Tag draus.
Ja, Sie möchten Tags verwenden.
Stellen Sie sich ein Tag nur als Bezeichnung oder Bezeichnung für eine bestimmte Revision vor. Es ist nach meiner Erfahrung sehr hilfreich, wichtige Meilensteine in einem Projekt zu markieren, sei es für die Produktionsfreigabe oder sogar für vorläufige QA-Releases. Sie werden oft in der Zeit zurückgehen und den Quellcode für ein bestimmtes Release sehen.
Wenn Sie bei der Veröffentlichung verzweigen, können Sie immer herausfinden, welche Version für die Produktion freigegeben wurde, aber das ist ein bisschen mühsam, wenn Sie nur ein Tag betrachten. Wenn Sie keine Versionszweige verwenden, können Sie leicht den Überblick darüber verlieren, welche Version zum Erstellen eines bestimmten Builds verwendet wurde.
Das Problem mit svn ist, dass es die Unterscheidung zwischen Tags und Zweigen verwischt. Jeder kann sich immer auf ein Tag festlegen, daher ist es nicht garantiert, dass es fest / unveränderlich ist. In anderen VCS wie PVCS ist ein "Tag" unveränderbar. Sie können eine Team-Konvention übernehmen, um die Übertragung von Tags zu verhindern, oder sogar Commit-Hooks, um die Übertragung von Tags zu verhindern.
Wir verwenden Tags (Labels) beim Erstellen neuer Baselines. Wir machen das einmal in der Woche, aber einige Teams machen das sogar mehrmals am Tag.
Der Punkt (für uns) ist immer sicherzustellen, dass die neue Baseline stabil ist: es ist also nicht nur ein Build, ein Build, der die gesamte Testsuite besteht, mehrere Stunden automatisierter Tests und möglicherweise auch manuell explorative Tests.
>Dann wird die Basislinie als Startpunkt für alle Aufgaben während der nächsten Iteration verwendet: Jede neue Aufgabe ist eine neue Verzweigung beginnend mit der Basislinie, von der bekannt ist, dass sie stabil ist die Aufgabe selbst.
Normalerweise setzen wir nur Tags (Labels) auf den Hauptzweig (oder Stamm oder Master, abhängig von Ihrem SCM-Geschmack), der der Integrationspunkt für alle anderen Zweige ist.
Wenn wir ein offizielles Produkt veröffentlichen, erstellen wir einen "release branch for it", so dass es nur Korrekturen erhält, während neue Entwicklungen auf "main" bleiben. Dann können diese "Wartungszweige" (hoffentlich nur ein oder zwei gleichzeitig) auch markiert werden.
Ich denke gerne über Tags als "nur ein netter Name für eine Revision". Ich habe immer über sie auf diese Weise nachgedacht, und IIRC im mercurial sind sie genau das. In Subversion jedoch, wie Sie sagen, sind sie tatsächlich (billige) Kopien von trunk / * zu Tags / phantasyname /
Ehrlich gesagt, würde ich die beiden Strategien für optimale Ergebnisse kombinieren: Tag und Zweig bei der Veröffentlichung. Ihr Tag heißt 1.0.0, Zweig 1.0-MAINT. Bugfixes gehen in Verzweigungen über, und Bugfix-Releases sind wieder Tags (1.0.1 kann durch ein Tag sein, das an einem bestimmten Punkt 1.0-MAINT aliasieren soll).
Vergessen Sie jedoch nicht, dass Tags und Zweige in Subversion eigentlich dasselbe sind: billige Kopien. Der einzige Unterschied zwischen ihnen ist die Semantik, die Sie / Ihr Team ihnen zuschreibt, so dass es darum geht, Leute dazu zu bringen, sich auf eine bestimmte Methode zu einigen und dabei zu bleiben (kann auf dem Server erzwungen werden, z für Release-Koordinatoren etc.)
Das Problem, das ich mit dem zweiten Ansatz sehe, ist: Wie werden Sie eine einfache Unterscheidung zwischen Software auf dem Gebiet machen, wenn Sie 1.0 erneut veröffentlichen? Das bedeutet, dass Sie vielleicht eine 1.0 und eine andere 1.0 haben, die sich tatsächlich auf eine andere Codebasis beziehen ....
Unveränderbare Snapshots des Quellcodes eines Projekts (und einer ausführbaren Datei) sind von unschätzbarem Wert für Tests jeglicher Art, egal ob es sich um ein strukturiertes Testen oder eine Feldnutzung handelt. Bei strukturierten Tests erstellen Sie Daten, auf die in Zukunft Monate oder Jahre verwiesen werden kann. Wann immer Sie diese Daten erneut lesen, sagt Murphys Gesetz, dass Sie wissen müssen, aus welchem Code es stammt. Wenn Sie sich nicht die Mühe machen, einen bestimmten Schnappschuss des Quellcodes zu zitieren, können Sie nicht sicher sagen, welcher Quellcode dem entspricht diese Testdaten.
Ich kann Ihnen nicht sagen, wie oft jemand zu mir kommt und sagte: "Dieser Mikrocontroller-Code funktioniert nicht, können Sie mir helfen?" und ich frage sie: "Welche Version verwendest du?" und sie sagen "Ich bin mir nicht sicher", weil sie kein gutes Release-Management betreiben (zumindest einen Aufkleber auf das Gerät setzen, besser Versionsinformationen in das EEPROM stellen, die in Echtzeit abgefragt werden können). & gt;: (
In SVN ist der technische Unterschied zwischen der Verwendung eines Tags und der Verfolgung einer Revision gleich Null. Ich finde, dass ich die Verwendung von Tags auf der Grundlage minimalisiere, wie SVNs Implementierung einfach eine billige Kopie ist und deinen "Strukturraum" durcheinander bringt.
Der wahre Unterschied liegt vor, wenn eine bestimmte Baseline einem großen Team von Entwicklern mitgeteilt wird. Revisionsverfolgung bringt eine zusätzliche Abstraktionsebene, die zu einer Fehlerquelle werden kann. Und wie wir alle wissen, wird jede Fehlerquelle, wenn Sie mit mehr als 50 Entwicklern zu tun haben, zu einem Bereich von Verwirrung und verschwendeter Zeit werden. Ein wortreiches Tag kann diese Verwirrung beseitigen und jeden Zweifel bezüglich des Zwecks einer Basislinie beseitigen.
Ich würde beide Ansätze kombinieren. Wann immer Sie eine Veröffentlichung machen, markieren Sie sie. Tags sollten sich niemals ändern, daher ist das Vorhandensein eines "1.0.0" -Tags ein Hinweis darauf, dass Sie nicht versuchen sollten, etwas anderes als 1.0.0 zu veröffentlichen.
Zur gleichen Zeit, als es an der Zeit war, 1.0.0 zu machen, würde ich es auf einen 1.0-Zweig setzen. Also ist der Fluss: Zweigstamm zu 1.0, tag diese neue 1.0 als 1.0.0, und deploy. Dann können Fehlerbehebungen in der 1.0-Verzweigung vorgenommen werden (um zu vermeiden, dass sie mit einer 1.1-zielgerichteten Entwicklung verwechselt werden, die sich bereits jetzt auf der Leitung befindet) und in die Leitung zusammengeführt werden. Jede Version der festen Version 1.0 ist als 1.0.x aus der 1.0-Verzweigung markiert. Dies ist im Prinzip der Ansatz, den wir bei der Arbeit mit Perforce verwenden, und das ist tatsächlich sehr ähnlich zu Subversion. (Lesen Sie die Antworten durch, ich denke, es ist praktisch identisch mit Vincents Empfehlung)
Soweit der Kommentar zu Tags redundant ist, weil Sie Revisionsnummern haben, stimmt das weitgehend, außer dass Tags auch einen Bereich angeben: d. h. welche Dateien im Repository vom Tag abgedeckt werden. Sie können vernünftigerweise jemanden bitten, sich /svn/proj1/tag/1.0.0 anzusehen, und sie sehen sich sofort einen kohärenten Arbeitsbereich an. Wenn Sie sie bitten, sich Revision X anzuschauen, müssen sie sich zuerst Revision X ansehen, um zu sehen, dass sie sich ändert (sagen wir) / svn / proj1 / trunk / Makefile und folgern daraus, dass / svn / proj1 / trunk / @ X was ist sie sollten sich anschauen. Was passiert, wenn Revision X Dateien in proj1 und proj2 berührte? Was natürlich böse ist, aber streng genommen sollte man sagen: / svn / proj1 / trunk / @ X. Und wo ist die Liste der Revisionsnummern gespeichert? Woher wissen wir, dass 1.0.0 Revision X ist? Es sollte IMHO möglich sein, das nur aus dem Repository zu bestimmen.
In Systemen wie Git sind Tags und Verzweigungen immer noch die gleichen (nur Verweise auf die Objektdatenbank), aber die Konvention besagt, dass sich Tag-Refs nicht ändern und Branch-Refs ( und vorzugsweise mit einer spezifischen Beschränkung, wie sie sich ändern). Perforce verfügt auch über "Labels", die eine Gruppe von Dateirevisionen unabhängig von einer Änderungsliste gruppieren. Das ist im Wesentlichen ein Tag, aber verwirrender: In der Vergangenheit haben wir die Änderungslistennummern verwendet (entsprechend den Versionsnummern von Subversion), die mit dem Namen des Zweiges qualifiziert sind, auf dem sie sich befinden sollten, um Versionen zu identifizieren. Die beiden sind fast identisch, also denke ich hier TMTOWTDI.
Tags und Links version-control release-management