Questo mi è venuto in mente su alcuni progetti. La soluzione migliore che ho avuto finora è di generare un numero di versione come questo:
x.y. < numero di commit > .r < git-hash >
Generalmente viene generato dal nostro sistema di build utilizzando una combinazione di alcuni file o tag statici per ottenere i numeri di revisione principali, git rev-list HEAD | wc -l
(che era più veloce dell'utilizzo di git log
) e git rev-parse HEAD
. Il ragionamento era il seguente:
- Avevamo bisogno della possibilità di avere il versioning di alto livello che si verificava esplicitamente (cioè x.y)
- Quando avveniva lo sviluppo parallelo, non dovevamo MAI generare lo stesso numero di versione.
- Volevamo facilmente rintracciare da dove proviene una versione.
- Quando le linee parallele sono state unite, volevamo che la nuova versione si risolvesse più in alto di uno dei rami.
Il numero 2 è invisibile alla maggior parte delle persone, ma è veramente importante e veramente difficile con il controllo del codice sorgente distribuito. SVN ti aiuta dandoti un numero di revisione singolo. Si scopre che un conteggio dei commit è il più vicino possibile, mentre si risolve magicamente anche il # 4. In presenza di rami, questo non è ancora univoco, nel qual caso aggiungiamo l'hash, che risolve nettamente anche il n. 3.
La maggior parte di questo era per ospitare la distribuzione tramite pip di Python. Ciò garantiva che pip install
sarebbe stato un po 'strano durante lo sviluppo parallelo (cioè i pacchetti da persone su rami diversi si sarebbero mescolati, ma in modo deterministico), ma che dopo l'unione, tutto risolto. Escludendo la presenza di un rebase esposto o di modifica, questo ha funzionato abbastanza bene per i requisiti di cui sopra.
Nel caso ve lo stiate chiedendo, abbiamo scelto di mettere la r davanti all'hash a causa di alcune stranezze con il modo in cui la confezione Python gestisce le lettere nei numeri di versione (cioè ae sono minori di 0, il che renderebbe "1.3.10. a1234 "<" 1.3.10 "<" 1.3.10.1234 ").