Domanda

Ho un paio di applicazioni Rails e io uso Git come il sistema di controllo versione. Io uso sia GitHub o Beanstalk, come i padroni di casa del repository.

Quello che sto cercando di è abbastanza semplice in teoria. mostrano in qualche modo l'ultimo commit numero ID (hash?) nel piè di pagina dell'applicazione web. In modo che quando sto guardando l'applicazione web che posso controllare che è impegnata e distribuito correttamente.

Posso immaginare che ci sono due metodi per affrontare questo. Il primo sarebbe una possibile caratteristica di Git che permette l'uscita del ID commit. La seconda sarebbe un gancio web post-commit (sia Beanstalk e GitHub consentano).

Qualcuno ha mai trovato un modo per fare questo, o qualcosa di simile?

Grazie,

Danny

È stato utile?

Soluzione

In primo luogo, una precisazione: gancio post-commit non può aggiungere commit-id al file un commit, perché impegnarsi id dipende commettere dell'albero superiore (che rappresenta directory in alto), id di albero top a sua volta dipende ids dei suoi membri, e l'ID di un file dipende dai suoi contenuti ... e questo contenuto è quello di includere commettere id. Non è possibile.

Ma diamo uno sguardo a diverse soluzioni:

In diretta, server side scripting

Se la vostra applicazione web viene distribuito dal vivo da repository git non-nudo (Spero che tu sappia quello che stai facendo WRT. Spingendo in repository non-nuda, cioè repository con checkout / albero di lavoro), allora il vostro web app può controllare TESTA utilizzando git rev-parse HEAD (dà SHA-1 di commit), o meglio git describe --dirty (l'opzione --dirty sarebbe rendono tornato stringa contenere informazioni se ci sono modifiche uncomitted nella zona di lavoro), o git describe --always HEAD.

git rev-parse HEAD dà qualcosa di simile 7611062b4ba6d1ebc4cf3e63c11204a4f5057660, mentre git describe --dirty dà qualcosa di simile v1.7.3.2-95-g7611062 (quali mezzi impegnano con abbreviato SHA-1 di 7611062, 95 commit dopo impegnano con tag 'v1.7.3.2'), ma dipende stampa si codifica utilizzando annotato tag.

Una variante di questo sarebbe quello di avere web app per controllare testa dal repository che è da qualche altra parte sullo stesso filesystem, ad esempio, con git --git-dir=/path/to/.git describe HEAD.

Nota a margine: se si utilizza Ruby, probabilmente desidera utilizzare grinta biblioteca. L'equivalente di versione git rev-parse HEAD sarebbe probabilmente (non testata!):

require 'grit'
include Grit

repo = Repo.new("/var/git/app.git")
head = repo.commits('HEAD', 1)

app_version = head.id

Dal vivo, file statici serviti da git checkout

Modifica Aggiunta la sezione 2010-10-23 13:33 0000 Se vi servono i file da cassa (worktree) del repository git non-nudo (non la tua situazione), è possibile utilizzare 'macchia' e 'pulite' comandi di filter gitattribute per eseguire CVS-come espansione di parole chiave su checkout / checkin.

Nel file di .gitattributes definirebbe i file su cui attributo filter dovrebbe agire:

*.rb filter=commitid

È possibile definire filtro nel file di configurazione git (ad esempio in .git/config), ad esempio

[filter "commitid"]
        smudge = sed -e "s/\$Revision: ?\$/\$Revision: $(git rev-parse HEAD)\$/1"
        clean =  sed -e "s/\$Revision: ?[^$]*\$/\$Revision: \$/1"

Il filtro smudge sostituirebbe '$ Revisione: $' con per esempio '$ Revisione: v1.7.3.2-95-g7611062' al momento della partenza (questo significa che controllati file di emissione dovrebbe contenere questo CVS-come parola chiave espanso). Il filtro clean eliminerebbe espansione per memorizzare il contenuto dei file di database di oggetti GIT (in repository git); altrimenti si avrebbe problemi con file etc confrontando.

Schierato con l'uso di git archive

Se invece distribuisce il web app, in modo che non risiedere in repository dal vivo (che ha le sue stranezze WRT. Spingere in esso, e che ha possibili inconvenienti di sicurezza), e si utilizza git archive da qualche parte (ad esempio per zip app per caricarlo sul vostro sito di hosting), è possibile fare uso di parola chiave sostituzione .

Prima di tutto bisogna dire che si desidera Git le parole chiave in un file sostituito da git archive . Fate che impostando export-subst per data di file, ad esempio con l'aggiunta di file di .gitattributes

*.rb export-subst

e quindi aggiungendo al file che contiene / genera footer della pagina per esempio

$Format:%H$

, che sarà sostituito da commettere hash (vedi pretty-formati descrizione ad esempio in git-log pagina man).


Implementato, utilizzando alcuni script di distribuzione

Se si utilizza un qualche tipo di script / meccanismo di script per distribuire l'applicazione web, si dovrebbe seguire Jefromi consiglio di avere il vostro script deploy incorporare le informazioni sulla versione.

Si dovrebbe chiedere a qualcun altro come impostare Capistrano (ammesso che lo si utilizza per la distribuzione) per posta: distribuzione sostituire '@@ VERSION @@' segnaposto nel file 'app.rb' con risultato di git describe --always HEAD ... Git progetto Makefile noreferrer usi sed per quella

Altri suggerimenti

Credo che ciò che si finirà per voler fare è, come parte del processo di "costruzione" (distribuzione, il tuo caso?), Conservare l'uscita di git rev-parse HEAD o git describe HEAD (meglio, assumendo tag stampa) in una file. La vostra applicazione può quindi visualizzare il contenuto del file. Il commettere hash non può mai realmente essere parte di qualsiasi contenuto cingolato (l'hash del commit dipende dal contenuto cingolato). Naturalmente, se la vostra applicazione è a corto di un pronti contro termine, si potrebbe semplicemente eseguire il comando dalla app, ma è molto più elegante di fare proprio una volta.

Questo è l'approccio adottato dal git per sé, tra l'altro. Ha una shell script di teeny che scarica sostanzialmente uscita git describe a GIT-VERSION-FILE, che viene poi compilato per fornire le informazioni sulla versione.

Speriamo che non ho capito male la tua situazione - Sono un po 'confuso da voi dicendo "una possibile caratteristica di Git che permette l'uscita del ID commit". Questa è una funzionalità di base di Git.

In primo luogo, la risposta alla tua domanda, eseguire il seguente comando nello script ruby:

`git log -n1 | head -1`.split.last

Secondo: Che cosa si intende utilizzare Beanstalk come host repository? Non è Beanstalk un server di accodamento?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top