Richtlinien für die Versionierung

Das Versionsverwaltungssystem von Fedora umfasst sowohl die Tags Version: und Release: als auch Epoch:. Das übergeordnete Ziel ist es, Paketsequenzen bereitzustellen, die vom Versionsvergleichsalgorithmus von RPM als Aktualisierungen behandelt werden, und gleichzeitig die unterschiedlichen und oft inkonsistenten Versionsverwaltungssysteme der Upstream-Bibliotheken zu berücksichtigen.

Das Feld Version: enthält die Version des Upstream-Projekts, und das Feld Release: gibt die Downstream-Releasenummer an.

Einige Definitionen

Beachten Sie, dass die jeweiligen Upstream-Projekte ihre eigene Terminologie verwenden können und es generell unmöglich ist, diese Begriffe vollständig allgemein zu definieren. Bei manchen Upstream-Projekten gilt jeder Commit als Version. Andere veröffentlichen nie Releases, sondern stellen den Nutzern einfach den jeweils verfügbaren Code aus dem Repository zur Verfügung.

„release version“

Eine Softwareversion, deren Veröffentlichung vom Upstream-Projekt beschlossen wurde. Die Veröffentlichung kann so einfach sein wie das Hinzufügen eines Git-Tags. Dies umfasst sogenannte „Point Releases“ oder „Patchlevel“, die von einigen Upstream-Projekten erstellt werden, da es sich dabei um zugewiesene und veröffentlichte Versionen handelt.

„snapshot“

Ein Archiv aus dem Quellcodeverwaltungssystem des Upstream-Projekts, das keiner Release-Version zugeordnet ist.

„prerelease version“

Vor einer Veröffentlichung legen viele Upstream-Entwickler fest, welche Version veröffentlicht werden soll, und erstellen dann sogenannte „Alphas“, „Betas“, „Release Candidates“ oder Ähnliches. Diese Versionen enthalten zwar bereits die neue Versionsnummer, weisen aber auch darauf hin, dass die Veröffentlichung noch nicht erfolgt ist. Wir bezeichnen diese Versionen als Vorabversionen. Auch alle Snapshots, die während der Vorbereitungsphase der Upstream-Entwickler erstellt werden, gelten als Vorabversionen.

„postrelease version“

Jede Version, die nach einer bestimmten Veröffentlichung erscheint, ist technisch gesehen eine „Post-Release“-Version. Bevor die Entwickler jedoch mit der Erstellung von Vorabversionen für die nächste Version beginnen, wird jeder Snapshot als Post-Release-Version betrachtet.

Unsortierte Versionssequenz

Eine Folge von Versionszeichenketten, die nicht der Reihenfolge der Versionsvergleichsfunktion von RPM entspricht. RPM verwendet eine relativ komplexe Versionsvergleichsfunktion, um festzustellen, ob ein Paket „neuer“ ist. Weicht die Definition einer „neueren“ Version durch den Entwickler von der RPM-Implementierung ab, führt die direkte Verwendung der Entwicklerversionen zu Aktualisierungen, die tatsächlich keine Pakete aktualisieren.

Epoch-Tag

Das Tag Epoch: liefert den wichtigsten Input für die Versionsvergleichsfunktion von RPM. Falls vorhanden, muss es aus einer positiven Ganzzahl bestehen. Es sollte nur eingeführt oder erhöht werden, wenn dies notwendig ist, um Probleme mit der Reihenfolge zu vermeiden. Das Tag Epoch: darf, sobald es einem Paket hinzugefügt wurde, niemals entfernt oder verringert werden.

Release-Tag

Der Release:-Tag sollte automatisch mithilfe des Makros %autorelease verwaltet werden:

Release: %autorelease

Wie in der Dokumentation zu %autorelease beschrieben, ersetzt der Build-Mechanismus das Makro durch die Anzahl der Bauvorgänge seit dem letzten Commit, der das Feld Version geändert hat, ergänzt durch den Tag %{?dist}. Das bedeutet, dass ein Commit, der Version ändert, automatisch Release: 1%{?dist} erhält, und nachfolgende Commits erhalten Release: 2%{?dist}, Release: 3%{?dist} usw.

Alternativ kann das Feld Release: manuell aktualisiert werden. Siehe Traditionelle Versionierung mit einem Teil der Upstream-Versionsinformationen im Release-Feld.

Einfache Versionierung

Die meisten Upstream-Versionierungsschemas sind „einfach“; sie erzeugen Versionen wie 1.2.03.007p1. Sie bestehen aus einer oder mehreren durch Punkte getrennten Versionskomponenten. Jede Komponente ist eine ganze Zahl, gegebenenfalls mit führenden Nullen. Die Komponenten können auch einen oder mehrere (ASCII-)Groß- oder Kleinbuchstaben enthalten. Der Wert einer Komponente darf niemals reduziert werden (auf einen Wert, der niedriger sortiert wird), ohne dass eine Komponente links davon erhöht wird. Die Versionssequenz (1.4a, 1.4b, 1.4) erfüllt dieses Kriterium nicht, da 4 niedriger sortiert wird als 4b. Die Sequenz (1.4, 1.4a, 1.4b) ist hingegen einfach.

Dies ist ein sehr gängiges Versionierungsschema, und die überwiegende Mehrheit der Softwareprojekte verwendet etwas, das so funktioniert.

So paketieren Sie Release-Versionen von Software mithilfe dieses Versionsschemas:

  • Verwenden Sie die Versionsnummer des Upstream-Projekts unverändert im Version:-Tag. Führende Nullen dürfen nicht entfernt werden.

Komplexe Versionierung

Es gibt mehrere Gründe, warum das einfache Schema in einer bestimmten Situation nicht funktionieren könnte:

  • Die Upstream-Entwickler haben sich nie für eine Version entschieden; es stehen nur Snapshots für die Paketierung zur Verfügung.

  • Die Upstream-Entwickler verwenden einfach kein Versionsschema, das bei der Versionsvergleichsoperation von RPM die korrekte Reihenfolge gewährleisten würde.

  • Sie möchten eine Vorabversion (Snapshot oder anderweitig) paketieren.

  • Sie möchten einen Nachveröffentlichungs-Snapshot paketieren.

  • Die Upstream-Entwickler gingen zunächst davon aus, einem bestimmten Schema zu folgen, änderte dieses dann aber auf eine Weise, die zu keiner korrekten Sortierung führt.

  • Sie müssen eine kleine Korrektur auf einen Release-Zweig von Fedora anwenden, ohne die neueren Zweige zu aktualisieren.

  • Mehrere der oben genannten Punkte könnten zutreffen (Glückwunsch!). Befolgen Sie alle relevanten Empfehlungen unten gleichzeitig.

Dieser Unterabschnitt beschreibt, wie die Versionsnummer des Upstream-Projekts so angepasst wird, dass sie für das Feld Version geeignet ist. Die Verwendung von Release: %autorelease bleibt unverändert.

Umgang mit nicht sortierten Versionen mit Tilde, Punkt und Caret

Das Tilde-Symbol („~“) wird vor einer Versionsangabe verwendet, die früher als alle anderen Komponenten sortiert werden muss. Es wird für Vorabversionen verwendet, die anderenfalls nicht korrekt sortiert werden würden.

Bei Upstream-Releases wie beispielsweise 0.4.0, 0.4.1, 0.5.0-rc1, 0.5.0-rc2 und 0.5.0 sollten die beiden „Release Candidates“ im Feld Version: die Werte 0.5.0~rc1 und 0.5.0~rc2 verwenden.

Bugfix- oder „Patchlevel“-Releases, die von Upstream-Entwicklern erstellt werden, sollten mit einfacher Versionsverwaltung behandelt werden. Das von Upstream verwendete Trennzeichen muss gegebenenfalls durch einen Punkt ersetzt oder weggelassen werden.

Wenn beispielsweise dieselbe Upstream-Seite 0.5.0-post1 als Bugfix-Version veröffentlicht hat, sollte diese „Post-Release“-Version 0.5.0-post1 im Feld Version: verwenden. Beachten Sie, dass 0.5.0-post1 in der Sortierung niedriger eingestuft wird als sowohl 0.5.1 als auch 0.5.0.1.

Das Caret-Symbol (‘^’) wird vor einer Versionskomponente verwendet, die später als alle anderen Komponenten ohne Caret sortiert werden muss. Es wird für Nachveröffentlichungs-Snapshots verwendet (siehe nächster Abschnitt).

Der Caret-Operator wird in RHEL7, das rpm 4.11 verwendet, nicht unterstützt. Wenn Sie RHEL7/EPEL7 mit derselben Spec-Datei unterstützen müssen, verwenden Sie stattdessen [Traditional versioning with part of the upstream version information in the release field].

Snapshots

Snapshots (eine Version aus dem Upstream-Quellcodeverwaltungssystem, die keiner Release-Version zugeordnet ist) müssen nach einem Caret-Zeichen (^) ein Snapshot-Informationsfeld enthalten. Der erste Teil des Feldes gewährleistet die korrekte Sortierung. Dieses Feld kann entweder das Datum im achtstelligen Format „JJJJMMTT“ enthalten, das die letzte Änderung des Quellcodes angibt, oder eine Zahl. Der Paketierer kann nach dem Datum bis zu 17 Zeichen zusätzliche Informationen hinzufügen, die das Versionsverwaltungssystem und die Commit-Kennung angeben. Das Snapshot-Informationsfeld wird an das oben beschriebene Versionsfeld angehängt und kann Informationen zur Vorabversion und zum Patchlevel enthalten.

Für das Feld mit den Snapshot-Informationen sollte eines der folgenden Formate verwendet werden:

  • <Datum>.<Revision>

  • <Datum><SCM><Revision>

  • <Nummer>.<Revision>

  • <Nummer>.<SCM><Revision>

  • <SCM><Datum>.<Revision>

  • <SCM><Nummer>.<Revision>

Dabei ist <scm> eine kurze Zeichenkette, die das vom Upstream-Projekt verwendete Versionsverwaltungssystem identifiziert (z.B. „git“, „svn“, „hg“) oder die Zeichenkette „snap“. Die Zeichenkette <scm> kann auf einen einzelnen Buchstaben abgekürzt werden. <revision> ist entweder ein kurzer Git-Commit-Hash, eine Subversion-Revisionsnummer oder eine andere Kennung, die die genaue Revision im Upstream-Versionsverwaltungssystem identifiziert. Falls das Versionsverwaltungssystem keine Kennung bereitstellt (z.B. CVS), sollte dieser Teil weggelassen werden. Für <revision> sollte kein vollständiger Hash verwendet werden, um zu lange Versionsnummern zu vermeiden; es reichen die ersten 7 bis 10 Zeichen.

Wenn beispielsweise die letzte Upstream-Version 0.4.1 war, könnte ein Snapshot im Feld Version: die Versionsnummer 0.4.1^20200601g01234ae verwenden. Wenn die Upstream-Entwickler anschließend eine Vorabversion mit der Versionsnummer 0.5.0-rc1 veröffentlichen, diese aber fehlerhaft ist und wir zwei Snapshots nach der Vorabversion erstellen müssen, könnten diese Snapshots im Feld Version: die Versionsnummern 0.5.0~rc1^20200701gdeadf00f und 0.5.0~rc1^20200702gdeadaeae verwenden.

Alternativ könnten diese drei Snapshots als 0.4.1^1.git01234ae, 0.5.0~rc1^1.gitdeadf00f und 0.5.0~rc1^2.gitdeadaeae versioniert werden.

Beachten Sie, dass 0.4.1^<etwas> höher sortiert wird als 0.4.1, aber niedriger als sowohl 0.4.2 als auch 0.4.1.<irgendetwas>.

Das Upstream-Projekt hat nie eine Version verwendet

Wenn die Upstream-Entwickler noch nie eine Version festgelegt haben, müssen Sie Version: 0 verwenden. „0“ wird niedriger eingestuft als jeder andere mögliche Wert, den die Upstream-Entwickler wählen könnten. Falls die Upstream-Entwickler die Version „0“ veröffentlichen, setzen Sie einfach Release: auf einen höheren Wert als den vorherigen. (Bei Verwendung von %autorelease geschieht dies automatisch.)

Das Upstream-Projekt verwendet in der Versionierung unzulässige Zeichen

Es ist möglich, dass die Upstream-Version neben ASCII-Buchstaben (Groß- und Kleinbuchstaben), Ziffern und Punkten auch andere Zeichen verwendet. Diese müssen entfernt und gegebenenfalls durch zulässige Zeichen ersetzt werden. Jegliche Änderungen dieser Art müssen in der Spec-Datei dokumentiert werden. Da es hier nicht möglich ist, alle potenziellen Fälle abzudecken, obliegt es dem Paketierer, das Upstream-Versionsschema einheitlich anzupassen.

Nachdem die Version so geändert wurde, dass sie keine ungültigen Zeichen mehr enthält, siehe [Unsortable versions] unten, falls die Änderungen, wenn sie auf nachfolgende Releases des Upstream-Projekts angewendet werden, nicht ordnungsgemäß sortiert werden.

Nicht sortierbare Versionen

Wenn das Upstream-Projekt ein Versionierungsschema verwendet, das nicht sauber sortiert, prüfen Sie zunächst, ob das Einfügen einer Tilde oder eines Carets ausreicht, um die Zeichenkette sortierbar zu machen.

Wenn beispielsweise vom Upstream-Projekt eine Sequenz wie 1.2pre1, 1.2pre2, 1.2final verwendet wird, könnten 1.2~pre1, 1.2~pre2, 1.2_final als Version verwendet werden. Der Unterstrich („_“) ist ein visuelles Trennzeichen, das die Sortierreihenfolge nicht beeinflusst, und wird hier verwendet, da „final“ keine separate Versionskomponente bildet.

Falls dies nicht möglich ist, verwenden Sie etwas Ähnliches wie das oben beschriebene Snapshot-Versionsinformationsfeld, wobei die Upstream-Version in den zweiten Teil des Snapshot-Informationsfelds verschoben wird: <Datum>.<Version>.

Wenn beispielsweise von Upstream Versionen wie I, II, …, VIII, IX`veröffentlicht werden, verwenden Sie `20200101.I, 20200201.II, …, 20200801.III, 20200901.IX im Feld Version.

Upstream bricht das Versionsschema

Es ist möglich, dass die Upstream-Entwickler ein anderes Versionsschema verwenden, von einem erwarteten Muster abweichen oder ihre Version einfach auf einen niedrigeren Wert zurücksetzen. Falls keine der oben genannten Maßnahmen zu einer korrekt sortierten Version führt oder eine Version liefert, die niedriger als die bereits in Fedora enthaltenen Pakete sortiert wird, bleibt Ihnen kaum eine andere Wahl, als das Epoch:-Tag zu erhöhen oder es durch Hinzufügen von Epoch: 1 zu verwenden. Versuchen Sie gleichzeitig, mit den Upstream-Entwicklern zusammenzuarbeiten, um die Notwendigkeit der Verwendung von Epoch: in Zukunft möglichst zu minimieren.

Beispiele

Versionsvergleich mit rpmdev-vercmp

Im Zweifelsfall überprüfen Sie die Sortierung mit rpmdev-vercmp aus dem Paket rpmdevtools:

==== Einfache Versionierung

[%header]
|===
|Upstream-Version | Version-Tag | Erklärung

|1.0     |1.0         | Das erste Release.

|1.1     |1.1         | Eine Upstream-Aktualisierung.

|1.2.1   |1.2.1       | Eine weitere Upstream-Aktualisierung. Zusätzliche Versionierungsebenen sind OK…

|1.3     |1.3         | …sie können problemlos kommen und gehen.
|===

In diesem Fall könnte die vollständige N-V-R beispielsweise `pkg-1.2.1-1.fc{AKTUELLEVERSION}` (unmittelbar nach einer Aktualisierung) oder `pkg-1.2.1-5.fc{AKTUELLEVERSION}` (nach Downstream-Rebuilds mit derselben Upstream-Version) lauten.

[%header]
|===
|Upstream-Version | Version-Tag | Erklärung

| 5.2    | 5.2        | Upstream-Release.

| 5.2a   | 5.2a       | Die Entwickler haben einen Buchstaben eingeführt, um Patch-Releases zu kennzeichnen. Da Sie darauf vertrauen, dass die Entwickler die Buchstaben in alphabetischer Reihenfolge verwenden, können Sie die Versionsangabe unverändert übernehmen.

| 5.2b   | 5.2b       | Weiteres Patch-Release nach 5.2 — keine Beta.

| 5.2b.1 | 5.2b.1     | Auch das ist OK, solange die Sequenz erhöht wird.

| 5.3    | 5.3        | Weiteres Upstream-Release.
|===

In diesem Fall könnte die vollständige N-V-R beispielsweise so aussehen: `pkg-5.2b.1-1.fc{AKTUELLEVERSION}`.

==== Komplexe Versionierung bei möglicher Zusammenarbeit mit Upstream-Entwicklern

[%header]
|===
|Upstream-Version | Version-Tag | Erklärung

| 1.0.0-rc1 | `+1.0.0~rc1+` | erste Vorveröffentlichung

| 1.0.0-rc2 | `+1.0.0~rc2+` | zweite Vorveröffentlichung

| 1.0.0     | `+1.0.0+`     | Release

| 1.0.1     | `+1.0.1+`     | Bugfix-Release

| 1.0.1-security1 | `+pkg-1.0.1.security1+` | sicherheitsrelevantes Bugfix-Release
|===

In diesem Fall könnte die vollständige N-V-R beispielsweise `pkg-1.0.0~rc2-42.fc{AKTUELLEVERSION}` lauten (wenn viele Rebuilds durchgeführt wurden).

==== Komplexe Versionierung mit nicht-sortierenden Upstream-Nachveröffentlichungsversionen

[%header]
|===
|Upstream-Version | Version-Tag | Erklärung

| 1.1.0~BETA      | `+1.1.0~BETA+` | Vorveröffentlichung, erste Beta

| 1.1.0~BETA1     | `+1.1.0~BETA1+` | Vorveröffentlichung, zweite Beta

| 1.1.0~BETA2     | `+1.1.0~BETA2+` | Vorveröffentlichung, dritte Beta

| 1.1.0~CR1       | `+1.1.0~CR1+` | Vorveröffentlichung, Release-Kandidat 1

| 1.1.0~CR2       | `+1.1.0~CR2+` | Vorveröffentlichung, Release-Kandidat 2

| 1.1.0-1%        | `+1.1.0+` | finales Release

| 1.1.0-GA1       | `+1.1.0.20201001.GA1+` | Nachveröffentlichung, GA1

| 1.1.0-CP1       | `+1.1.0.20201011.CP1+` | Nachveröffentlichung, CP1, nach GA1, wird nicht sauber sortiert

| 1.1.0-CP2       | `+1.1.0.20201101.CP2+` | Nachveröffentlichung, CP2, nach CP1

| 1.1.0-SP1       | `+1.1.0.20210101.SP1+` | Nachveröffentlichung, SP1, nach CP2

| 1.1.0-SP1-CP1   | `+1.1.0.20210105.SP1_CP1+` | Nachveröffentlichung, SP1_CP1, nach SP1
|===

In diesem Fall könnte die vollständige N-V-R beispielsweise so aussehen: `pkg-1.1.0.20210105.SP1_CP1-1.fc{AKTUELLEVERSION}`.

==== Komplexe Versionierung mit Vorabversion- und Nachveröffentlichungs-Snapshots

[%header]
|===
|Upstream-Version | Version | Erklärung

| 1.0.0-rc1            | `+1.0.0~rc1+` | Erste Vorveröffentlichung

| 1.0.0-rc2            | `+1.0.0~rc2+` | Zweite Vorveröffentlichung

| git commit `f00fabd` | `+1.0.0~rc2^20210101gf00fabd+` | Snapshot *nach* der Vorveröffentlichung

| 1.0.0                | `+1.0.0+`     | Ein Release

| 1.0.1                | `+1.0.1+`     | Ein Bugfix-Release

| git commit `bbbccc0` | `+1.0.1^20210203gbbbccc0+` or `+pkg-1.0.1^1.gbbbccc0+` | Ein Snapshot

| 1.0.1-security1      | `+1.0.1.security1+` | Eine Sicherheitsaktualisierung. Erfahrungsgemäß verfügen diese Aktualisierungen über sortierbare Versionsnummern. Falls nicht, könnte man stattdessen '`+<Datum>.security1+`' verwenden.

| git commit `abc0202` | `+1.0.1.security1^20210301gabc0202+` or `+pkg-1.0.1.security1^1.gabc0202+` | Ein weiterer Snapshot
|===

In diesem Fall könnte die vollständige N-V-R beispielsweise so aussehen: `pkg-1.0.1.security1^20210301gabc0202-1.fc{AKTUELLEVERSION}`.

[#traditional-versioning]
== Traditionelle Versionierung mit einem Teil der Upstream-Versionsinformationen im Release-Feld

Die in diesem Abschnitt beschriebene Methode wird als veraltet angesehen, **kann aber noch verwendet werden**. Wie bereits im Abschnitt xref:_handling_non_sorting_versions_with_tilde_dot_and_caret [Umgang mit nicht sortierbaren Versionen mithilfe von Tilde, Punkt und Caret] erwähnt, wird diese Methode für Pakete mit komplexer Versionsverwaltung empfohlen, insbesondere für die Unterstützung von RHEL7 und anderen Systemen mit älteren RPM-Versionen.

Bei dieser Methode wird `+%autorelease+` nicht verwendet, und das Feld `Release` muss manuell verwaltet werden.

Diese Methode zur Behandlung der meisten Vor- und Nachveröffentlichungsversionen sowie nicht sortierbarer Versionen beinhaltet das mögliche Entfernen einiger Informationen aus dem `+Version:+`-Tag und das Hinzufügen einer zusätzlichen Struktur zum `+Release:+`-Tag. Der strukturierte `+Release:+`-Tag kann potenziell aus vier Feldern bestehen:

* Release-Nummer des Pakets (`+<pkgrel>+`)
* Zusätzliche Versionsinformationen (`+<extraver>+`)
* Snapshot-Information (`+<snapinfo>+`)
* minimale Erhöhung der Versionsnummer (`+<minorbump>+`)

Die Release-Nummer des Pakets **muss** immer angegeben werden, während die anderen Angaben je nach Situation vorhanden sein können oder nicht.

Die vorhandenen Elemente werden (durch Punkte getrennt) zum endgültigen `+Release:+`-Tag kombiniert. In der üblichen Notation, wobei eckige Klammern optionale Elemente kennzeichnen:

    <pkgrel>[.<extraver>][.<snapinfo>]%{?dist}[.<minorbump>]

Die tatsächlichen Werte für diese drei Felder hängen von der jeweiligen Situation ab und werden in den folgenden Abschnitten erläutert. Beachten Sie, dass in Ihrem speziellen Fall `+<extraver>+` oder `+<snapinfo>+` möglicherweise nicht benötigt werden und `+<minorbump>+` in den meisten Fällen überhaupt nicht verwendet wird. Lassen Sie einfach die Felder weg, die Sie nicht benötigen.

Beachten Sie, dass das „dist“-Tag von anderen Systemkomponenten bereitgestellt wird und unter Umständen zusätzliche Strukturen, einschließlich Tilden, enthalten kann. Da dies nicht im Einflussbereich des Paketierers liegt, wird diese Struktur hier nicht behandelt. Der Paketierer **muss** `+%{?dist}+` unverändert wie oben angegeben einfügen.

=== Nicht sortierbare Versionen

Wenn das Upstream-Projekt ein Versionsschema verwendet, das nicht korrekt sortiert, prüfen Sie zunächst, ob sich Teile der Versionszeichenkette rechts entfernen lassen, so dass der Rest sortierbar ist. Dies ist oft möglich, wenn die Upstream-Version eine Sequenz wie („1.2pre1“, „1.2pre2“, „1.2final“) verwendet. Verwenden Sie in diesem Fall den entfernten Teil als `+<extraver>+` (siehe oben) und den Rest als Paketversion. Falls durch diese Aufteilung ein führender oder nachfolgender Punkt entsteht, entfernen Sie diesen.

Falls dies nicht möglich ist, verwenden Sie „Version: 0“ und verschieben Sie die _gesamte_ Versionszeichenkette in `+<extraver>+`.

=== Snapshots

Alle Snapshots **müssen** ein Snapshot-Informationsfeld (`+<snapinfo>:+`) im `+Release:+`-Tag enthalten. Dieses Feld muss mindestens das Datum im achtstelligen Format „JJJJMMTT“ enthalten. Der Paketierer **kann** nach dem Datum bis zu 17 Zeichen zusätzlicher Informationen hinzufügen. Folgende Formate werden empfohlen:

* `+JJJJMMTT.<Revision>+`
* `+JJJJMMTT<SCM><Revision>+`

Dabei ist `+<SCM>+` eine kurze Zeichenkette, die das vom Upstream-Projekt verwendete Versionsverwaltungssystem identifiziert (z. B. „git“, „svn“, „hg“) oder die Zeichenkette „snap“. Die `+<Revision>+` ist entweder ein kurzer Git-Commit-Hash, eine Subversion-Revisionsnummer oder etwas anderes, das die genaue Revision im Versionsverwaltungssystem des Upstream-Projekts identifiziert. Wird CVS verwendet, existieren solche Revisionsinformationen natürlich nicht, daher werden sie weggelassen; andernfalls **sollten** sie angegeben werden.

=== Vorabversionen

Verwenden Sie im `+Version:+`-Tag die Versionsnummer, die die Upstream-Entwickler für die nächste Veröffentlichung festgelegt haben. Verwenden Sie für das Feld des `+Release:+`-Tags eine Zahl der Form „0.N“, wobei N eine ganze Zahl ist, die mit 1 beginnt und für jede Revision des Pakets erhöht wird. Vorabversionen **müssen** ein `+Release:+`-Tag kleiner als 1 verwenden, da dies der einzige Hinweis darauf ist, dass eine Vorabversion paketiert wurde.

=== Release- und Post-Release-(Nachveröffentlichungs-)versionen

Verwenden Sie für das Feld `+<pkgrel>+` des Tags `+Release:+` eine ganze Zahl, die mit 1 beginnt und für jede Revision des Pakets erhöht wird. Release- und Post-Release-Versionen **müssen** für das `+Release:+`-Tag eine Zahl größer oder gleich 1 verwenden.

=== Rebuilds in älteren Zweigen mittels `<minorbump>`

In der unter <<Only an old branch needs a change>> beschriebenen Situation **können** Sie `+Release+` anpassen, indem Sie eine Zahl *nach* dem dist-Tag anhängen. Dadurch erstellen Sie eine E-V-R für F{AKTUELLEVERSION}, die immer noch niedriger ist als die in F{NÄCHSTEVERSION}. Setzen Sie `+<minorbump>+` auf eine ganze Zahl, die mit „1“ beginnt, und erhöhen Sie sie für jede kleinere Aktualisierung um 1. Entfernen Sie `+<minorbump>+`, sobald Sie die Paketversion normal erhöhen können, ohne Probleme mit der Reihenfolge zu verursachen.

=== Beispiele

Viele mögliche Szenarien der traditionellen Versionierung finden Sie in den https://fedoraproject.org/wiki/Package_Versioning_Examples[Beispielen zur Paketversionierung].


== Rawhide darf vorübergehend „zurückbleiben“

Ein Paket **kann** vorübergehend einen niedrigeren EVR-Wert in Rawhide im Vergleich zu einem Release-Zweig von Fedora haben, jedoch nur dann, wenn das Paket in Rawhide nicht gebaut werden kann. Dies ermöglicht es, wichtige Aktualisierungen unabhängig vom aktuellen Status von Rawhide in bestehende Fedora-Releases zu integrieren.