2009-02-05 15 views
17

Ho un'applicazione JavaScript statica + HTML open source distribuita in circa tre diversi posti al momento, una sul mio computer locale, uno su un server interno e uno su un server esterno stabile.Come dovresti includere l'id di commit corrente nei file di un progetto Git?

Mi piacerebbe essere in grado di dire immediatamente quale versione è distribuita in quale posto, e mi piacerebbe che i giornalisti di bug abbiano un facile accesso alla versione su cui stanno segnalando il bug.

Idealmente mi piacerebbe, come parte del processo di commit, che un file venga scritto con l'hash del commit. Naturalmente, da quello che so di Git questo è impossibile, poiché includere l'hash calcolato come parte di un file in un commit cambierebbe l'hash calcolato di quel commit.

D'altra parte, potrei incorporare la creazione di questo come parte di un processo di compilazione. Al momento non ho un processo di compilazione e vorrei evitare di aggiungere un passaggio se possibile.

Qual è il modo più pulito per farlo?

risposta

6

Aggiungilo al tuo sistema di distribuzione automatica.

Se la distribuzione non è automatizzata, quindi automatizzarla e aggiungerla lì. Quindi hai rimosso un passaggio.

Rendilo più utile "questo è stato distribuito in data x alla volta dal repository z". L'hash del commit in realtà non significa molto per i non sviluppatori.

+5

Aggiungerei l'output "git describe". – Dustin

29

Ci sono alcune sottigliezze a questo a causa della natura di Git. Il modo in cui l'ho fatto è copiando ciò che fanno gli sviluppatori Git. Innanzitutto, ti consigliamo di utilizzare tag annotati, che probabilmente sono comunque una buona idea. Per rivedere, è possibile creare un nuovo tag come questo:

$ git tag -a -m "Version 0.2" v0.2 HEAD 

Poi (come suggerito nel post di Otto) è possibile utilizzare git describe per un utile "versione" stringa che includerà il numero di commit da quando il tag e il cifre iniziali dello sha1 del commit corrente. Ecco un esempio di uno dei miei progetti:

$ git describe 
v1.0-3-gee47184 

Cioè, questo copia è 3 impegna davanti al tag "v1.0" e il commit SHA1 inizia con ee47184 (io non sono sicuro perché essi comprendono che portando 'g').

Gli sviluppatori Git fanno un ulteriore passo avanti e includono anche un ulteriore bit se la copia di lavoro viene modificata (senza commit). Ciò richiede alcuni altri passaggi, quindi è tutto racchiuso in uno script che chiamano VERSION-GEN. Quando viene eseguito, stampa la stringa di versione sullo standard output e crea anche un file VERSION-FILE (lo script fa attenzione a non ri-toccherà quel file se la versione non è cambiata, quindi è compatibile con gli strumenti di costruzione). Quindi, è possibile includere il file che VERSION-FILE nel codice sorgente, file di aiuto, ecc

Usando il mio esempio VERSION-GEN sceneggiatura (qui di seguito), la mia stringa di versione per l'esempio di cui sopra è:

$ VERSION-GEN 
version: 1.0-3-gee47 

Se modifico uno qualsiasi dei file monitorati Ecco come si presenta:

$ VERSION-GEN 
version: 1.0-3-gee47-mod 

Ecco la mia versione leggermente modificato di VERSION-GEN. Si noti che si aspetta che i tag che contrassegnano le versioni abbiano la forma v [0-9] * (ad es., V1.0 o v0.2 o v12.3.4 o v12.2-4feb2009 ecc.)

#!/bin/sh 

# Tag revisions like this: 
# $ git tag -a -m "Version 0.2" v0.2 HEAD 

VF=VERSION-FILE 
DEFAULT_VERSION=UKNOWN 

LF=' 
' 

# First see if there is a version file (included in release tarballs), 
# then try git-describe, then default. 
if test -d .git -o -f .git && 
    VN=$(git describe --abbrev=4 HEAD 2>/dev/null) && 
    case "$VN" in 
    *$LF*) (exit 1) ;; 
    v[0-9]*) 
     git update-index -q --refresh 
     test -z "$(git diff-index --name-only HEAD --)" || 
     VN="$VN-mod" ;; 
    esac 
then 
     continue 
    #VN=$(echo "$VN" | sed -e 's/-/./g'); 
else 
    VN="$DEFAULT_VERSION" 
fi 

VN=$(expr "$VN" : v*'\(.*\)') 

# Show the version to the user via stderr 
echo >&2 "version: $VN" 

# Parse the existing VERSION-FILE 
if test -r $VF 
then 
    VC=$(sed -e 's/^version: //' <$VF) 
else 
    VC=unset 
fi 

# If version has changed, update VERSION-FILE 
test "$VN" = "$VC" || { 
    echo "version: $VN" >$VF 
    echo >&2 "($VF updated)" 
} 
+0

Ci sono un paio di refusi alla fine dello script. Sostituire le ultime 3 righe con: VC = $ (sed -e '/^versione s: //' $ VF) echo> & 2 "($ VF aggiornato)" fi nota la chiusura ')' e sostituendo l'ultimo '}' con fi. – Patrick

+0

Penso che il renderer abbia ingoiato diverse righe della sceneggiatura. Ho inviato una modifica per indentare il codice anziché avvolgerlo in codice/pre-tag. Le ultime righe dovrebbero essere '# analizzare l'esistente VERSIONE-FILE' ' se il test -r $ VF' ' 'then' \t VC = $ ('/^versione s: //' sed -e < $ VF) '' else' '\t VC = unset' ' 'fi' # Se la versione è cambiata, aggiornamento di versione-file' ' test "$ VN" = "$ VC" || { '' \t echo "versione: $ VN"> $ VF' '\t echo> & 2 "($ VF aggiornato)"' ' }' – seanf

+0

Wow, brutto. Ho messo una copia dell'intero script qui: https://gist.github.com/880771 – seanf

Problemi correlati