Thema: release-management
-
Tags und Releases: Lightweight- versus annotierte Tags und wie sie sich verbreiten
Ein Lightweight-Tag ist nur ein Name für einen Commit; ein annotierter Tag ist ein eigenes Objekt mit Tagger, Datum, Nachricht und optionaler Signatur – deshalb ignoriert git describe Lightweight-Tags standardmässig, und deshalb sollten Releases annotierte oder signierte Tags verwenden; Tags werden nicht zusammen mit Branches gepusht, ausser mit --follow-tags oder --tags, und ein veröffentlichter Tag sollte nie verschoben werden.
-
Cherry-Picking: wann es passt und was es die Historie kostet
git cherry-pick spielt die Änderung eines Commits als neuen Commit mit anderer ID nach; es ist das richtige Werkzeug, um einen Fix auf einen Wartungs-Branch zurückzuportieren oder einen einzelnen Commit aus einem aufgegebenen Branch zu retten, doch jedes Pick erzeugt ein Duplikat, das Merges nicht erkennen können, daher den Ursprung mit -x festhalten und mergen statt picken, wenn der ganze Branch gewollt ist.
-
Release-Kadenz für ein kleines Projekt: zeitbasierte Züge versus Release-wenn-bereit
Eine Versionsnummer sagt, was ein Release verspricht; eine Kadenz-Richtlinie sagt, wann Releases stattfinden. Rust liefert alle sechs Wochen ein Stable-Release aus einem Nightly-Beta-Stable-Zug, Python wechselte mit PEP 602 zu einem jährlichen Feature-Release, und Django gibt Feature-Releases nach einem zeitbasierten Zeitplan heraus, mit Patch-Releases bei Bedarf. Ein kleines Projekt kann diese Form übernehmen: Feature-Releases nach Kalender oder sobald sich etwas Nennenswertes angesammelt hat, Patch-Releases, sobald eine Korrektur fertig ist.
-
Eine Funktion in einer Bibliothek als veraltet markieren: warnen, den Ersatz dokumentieren, planmässig entfernen
Eine Deprecation in einer Bibliothek besteht aus vier Teilen: einem Ersatz, der zuerst existiert, einer Laufzeitwarnung zusammen mit einem Dokumentationshinweis, der Version und Ersatz nennt, einem Eintrag im Changelog und einer Entfernungs-Version, die im Voraus durch eine Richtlinie festgelegt wird. PEP 387 verlangt bei Pythons jährlichem Rhythmus eine Deprecation-Frist von mindestens zwei Jahren und beschreibt eine rein dokumentarische «Soft Deprecation»; Django entfernt Übergangslösungen (Shims) frühestens zwei Feature-Releases nach der Warnung.
-
Conventional Commits: maschinenlesbare Commit-Typen
Die Spezifikation Conventional Commits fügt Commit-Nachrichten ein typisiertes Präfix (feat, fix und andere) sowie Markierungen für Breaking Changes hinzu, damit sich Changelogs und Versionssprünge automatisch ableiten lassen.
-
Semantic Versioning: was eine Versionsnummer verspricht
Semantic Versioning 2.0.0 kodiert Kompatibilitätsversprechen in MAJOR.MINOR.PATCH und definiert Suffixe für Vorabversionen und Build-Metadaten; es funktioniert nur, wenn die öffentliche API deklariert ist.
-
API versioning: when and how to break compatibility
Most changes can be additive; a new major version is a last resort that doubles the surface to support. Version in the path or media type, document the compatibility rules, and deprecate before removing.
-
Supporting several release lines: which fixes go where
A support policy is a table of release lines with a status each (feature, bugfix, security-only, end of life) and a rule for which fix classes are backported to which lines. Python maintains a series with bugfix releases for two years and security-only releases for three more; Django backports critical fixes to the last feature release and security and data-loss fixes to the last two plus long-term-support lines; Rust supports only the most recent stable. A small project should publish the table and default to the narrowest promise it can keep.
-
Keeping a changelog for humans
A changelog is a curated, chronologically ordered list of notable changes per version; Keep a Changelog defines a small structure (Added, Changed, Deprecated, Removed, Fixed, Security) and an Unreleased section.
Maschinenlesbar: JSON