Hoe beheer ik het versienummer in Git?

Stel je voor dat de blerp-opdrachtregeltool wordt onderhouden op . Deze tool heeft de (verborgen) --versionoptie die de versie(laten we zeggen 0.1.2) en een andere --commitdie het commit-nummer retourneert waaruit het is opgebouwd.

Zowel de versie als het commit-nummer zijn hard gecodeerd op de codebasis.

Nu maak ik een bugfix en verbind en herbouw mijn programma. Ik zal nog steeds 0.1.2zien, hoewel deze nieuwe versie verschilt van de originele 0.1.2. Alleen de commit zal me vertellen dat het niet dezelfde 0.1.2 is. Is die bugfix een ander versienummer waard?

Een oplossing is dat elke keer dat ik een commit maak, ik het hardgecodeerde versienummer verhoog (wat inhoudt dat ik altijd minimaal 2 bestanden voor elke commit moet wijzigen). Dit is een bindende oplossing en het werkt niet wanneer de ontwikkelaars aan verschillende actieve branches werken. Als Bob werkt aan feature foouit versie 0.1.2en Alice werkt aan feature baruit dezelfde versie. Hoe verhogen ze hun versienummer? Bob kan de oneven gebruiken en Alice de even. Wat als Eve aan een derde functie werkt?

Een andere oplossing kan zijn om de Git-tags te gebruiken om automatisch het versienummer te genereren. Een script kan de dichtstbijzijnde tag vinden die begint met vzoals v0.1.2en de tagnaam gebruiken als het versienummer plus de eerste n cijfers van de huidige commit (v0.1.2 (build 4acd21)). Dit werkt goed als de werkdirectory schoon is. Men kan zich voorstellen om een ​​*toe te voegen voor het buildnummer om aan te geven dat de werkdirectory niet schoon is. Het grootste probleem met deze oplossing is dat als iemand de bronnen exporteert, hij geen blerpkan bouwen.

Welk alternatief kan dit probleem oplossen?


Antwoord 1, autoriteit 100%

Alexey Kiselev en Dario hintten al naar het antwoord, maar ik zal proberen het in detail uit te leggen.

Versieschema’s

Er zijn twee soorten versiebeheerschema’s:

  1. Intern versienummer: dit kan vele malen per dag worden verhoogd (bijv. revisiecontrolenummer)
  2. Uitgebrachte versie: dit verandert minder vaak (bijv. semantische versiebeheer)

Mensen gebruiken verschillende schema’snaargelang hun behoefte, maar semantische versiebeheerwordt vrij veel gebruikt en is geschreven door Tom Preston-Werner, mede-oprichter van GitHub.

Semantische versiebeheer

Semantische versiebeheer volgt het patroon van X.Y.Z

Of leesbaarder is [major].[minor].[patch]-[build/beta/rc]

Bijvoorbeeld 1.2.0-beta

major or Xkan worden verhoogd als er grote wijzigingen in de software zijn, zoals achterwaarts incompatibele API-release.

minor or Ywordt verhoogd als achterwaarts compatibele API’s worden geïntroduceerd.

patch or Zwordt verhoogd na een bugfix.

Hoe bereiken we dit met Git?

Door tags te gebruiken:

Tags in Git kunnen worden gebruikt om een ​​versienummer toe te voegen.

git tag -a "v1.5.0-beta" -m "version v1.5.0-beta"

voegt een versietag van v1.5.0-bèta toe aan uw huidige Git-repository. Elke nieuwe commit hierna zal de tag automatisch verhogen door het commit-nummer en de commit-hash toe te voegen. Dit kan bekeken worden met het git describecommando.

v1.5.0-beta-1-g0c4f33fhier is -1-het commit-nummer en 0c4f33fde afkorting van de hash van de commit. Het voorvoegsel gstaat voor "git".

Volledige details kunnen worden bekeken met:

git show v1.5.0-beta


Antwoord 2, autoriteit 23%

Alsjeblieft, bekijk een kijkje op git beschrijven Commando. Deze opdracht toont u de nieuwste tag en een hoeveelheid commits gemaakt nadat de tag is ingesteld. Het is ook mogelijk om de vuiligheid van de repository te tonen.

Zoals u hebt vermeld, zou deze opdracht niet werken zonder de GIT-repository (GIT-map) en GIT geïnstalleerd. Maar het is bijna onvoorstelbare ontwikkelaar vandaag zonder git, maar met alle andere gereedschappen geïnstalleerd.


3, Autoriteit 4%

Revisienummers moeten door u worden gehandhaafd, niet door git. Zoals, in tegenstelling tot SVN, heb je geen incrementaal revisienummer dat op elke commit groeit, er geen uitweg uit de doos om te git om te contextualiseren wat je versie is.

Other episodes