2013-05-03 29 views
8

che è più di un know-how domande probabilmente:GIT: Avere corrente commettere hash e ultima tag nel file sul commettere

sto versioni con git e inviare file di PHP CMS per il sito di test o di produzione utilizzando rsync. Ora vorrei tenere traccia di quale commit è attualmente distribuito usando un sistema infallibile e automatizzato, stavo pensando a questo:

Configurare un hook git per aggiungere/aggiornare un file di testo con l'ultimo tag e commettere hash. Quindi posso facilmente consultare il commit.

Il mio problema è che al momento del pre-commit lo script non conoscerà l'hash del commit. Esiste un metodo diretto per ottenere questo risultato (o un altro approccio che arriva agli stessi fini)?

Grazie per l'input in anticipo!

+0

penserei si desidera gestire che sul lato deploy. Scrivi uno script per eseguire il deploys, quindi fai in modo che lo script copi l'hash corrente da qualche parte in ogni file prima di copiarli. – Mason

+0

Divertente, dopo aver postato la domanda ho ottenuto esattamente quell'idea. Tuttavia, avere git che si prenda cura del file di versione sarebbe ancora meglio, in questo modo non importa come viene gestita la distribuzione. –

+0

Se si tenta di memorizzare le informazioni sulla versione in un file con controllo della versione di git, update e commit, si otterrà un nuovo commit SHA1. :) Devi farlo al di fuori di git. – Tuxdude

risposta

2

Questa è una FAQ.

https://git.wiki.kernel.org/index.php/Git_FAQ#Does_Git_have_keyword_expansion.3F

Ricerca per l'esportazione-subst in gitattributes (5), è necessario utilizzare git-archivio (1) per ottenere la sostituzione fatto.

(% H vi dà l'hash. Per il ottenere il tag si sarebbe ancora bisogno di uno script che chiama git-descrivo (1), non vedo un formato per questo)

+0

Bello! Dopo alcuni tentativi ed errori, ecco i miei .gitattribtues: 'version.txt export-subst'. E il mio version.txt: '$ Format:% H $' –

3

Dal momento che 'ri utilizzando rsync per deploy il codice, quindi, fare qualcosa di simile:

$ git describe --long > VERSION.txt 

poi, includere il VERSION.txt nel pacchetto rsync.

Il git descrivere stringa assomiglia a questo:

$ git describe --long 
r1.0-2-gca93d0a 

In quanto sopra:

  1. Ultime tag è r1.0
  2. Il indica che siamo due commit oltre quel tag
  3. The g sta per 'git' (ok, che è un po 'strano, ma, vabbè)
  4. L'hash corrente è ca93d0a
+0

Grazie, bello, ho visto la tua risposta dopo aver postato il mio - controlla la risposta dove git si prende cura di esso. Vieni a pensarci, lasciare che lo script rsync si prenda cura di esso ha i suoi meriti, dal momento che si assicura che il file di versione sia aggiornato. Potrei persino prendere lo script rsync fino ad ora per disabilitare una distribuzione se ci sono modifiche non modificate nella copia di lavoro. –

+0

Buona idea di controllare l'albero di lavoro per i randagi. Puoi votare la mia risposta se è utile? Ho bisogno di un paio di punti per arrivare al livello successivo. –

9

Va bene, penso che ho ottenuto un ok-solution:

C'è un gancio git chiamato post-commit e qui è quello che faccio:

  • ho messo il file tenendo premuto il tag/hash su .gitignore (per evitare inutili cambiamenti sul prossimo commit)
  • Lascia che il hook post-commit aggiorni il file di versione.

contenuto del file gancio:

#!/bin/sh 
git describe --tags > version.txt 

Ora sono sicuro che il file è up-to-date dopo ogni commit, quindi sono tutti insieme finché faccio un impegno prima di Distribuzione.

Note: caveat principianti Nasty di: rendere il file eseguibile gancio, git ignora il file senza preavviso se non lo è.

Tutto su ganci git: http://git-scm.com/book/en/Customizing-Git-Git-Hooks

Tutto su .gitignore: http://git-scm.com/book/en/Git-Basics-Recording-Changes-to-the-Repository#Ignoring-Files

Cheers,

Martin

Problemi correlati