Cosa sta succedendo qui: Git è ottimizzato per passare da un ramo all'altro il più rapidamente possibile. In particolare, git checkout
è progettato per non toccare alcun file identico in entrambi i rami.
Sfortunatamente, la sostituzione di parole chiave di RCS si rompe. Ad esempio, utilizzando $Date$
richiedere git checkout
per toccare ogni file nell'albero quando si cambia ramo. Per un repository delle dimensioni del kernel di Linux, questo porterebbe tutto a una brusca frenata.
In generale, la soluzione migliore è quella di etichettare almeno una versione:
$ git tag v0.5.whatever
... e quindi chiamare il seguente comando dal Makefile:
$ git describe --tags
v0.5.15.1-6-g61cde1d
Qui, git sta dicendo io che sto lavorando su una versione anonima 6, ho passato la v0.5.15.1, con un hash SHA1 che inizia con g61cde1d
. Se si configura l'output di questo comando in un file *.h
da qualche parte, si è in affari e non avrà alcun problema a collegare il software rilasciato al codice sorgente. Questo è il modo preferito di fare le cose.
Se non è possibile evitare l'uso di parole chiave RCS, è possibile iniziare con questo explanation by Lars Hjemli. Fondamentalmente, $Id$
è abbastanza semplice, e se si utilizza git archive
, è anche possibile utilizzare $Format$
.
Ma, se proprio non si può evitare di parole chiave RCS, il seguente dovrebbe iniziare:
git config filter.rcs-keyword.clean 'perl -pe "s/\\\$Date[^\\\$]*\\\$/\\\$Date\\\$/"'
git config filter.rcs-keyword.smudge 'perl -pe "s/\\\$Date[^\\\$]*\\\$/\\\$Date: `date`\\\$/"'
echo '$Date$' > test.html
echo 'test.html filter=rcs-keyword' >> .gitattributes
git add test.html .gitattributes
git commit -m "Experimental RCS keyword support for git"
rm test.html
git checkout test.html
cat test.html
Sul mio sistema, ottengo:
$Date: Tue Sep 16 10:15:02 EDT 2008$
Se hai difficoltà a raggiungere le uscite della shell nei comandi smudge
e clean
per lavorare, basta scrivere i propri script Perl per espandere e rimuovere le parole chiave RCS, rispettivamente, e usare quegli script come filtro.
Si noti che si davvero non si vuole fare questo per più file di quanto assolutamente necessario, o git perderà gran parte della sua velocità.
può questa cosa "git descrivere" essere eseguita in modo trasparente come parte delle normali operazioni git? Non possiamo aspettarci attendibilmente che il comando git sia disponibile nelle nostre istanze di Hudson. –
@ Thorbjørn Ravn Andersen, non ho familiarità con Hudson, ma se l'istanza di Hudson non ha una copia di git, allora un altro sistema deve aver eseguito git per generare un checkout della fonte. Usa _that_ system per eseguire git describe. Non sono sicuro se questo aiuti. – emk
Ho finito per usare jGit - supporta "rev-parse HEAD" ma è molto silenzioso al riguardo. –