Domanda

Sfogliando la documentazione di git, non riesco a vedere nulla di analogo agli hook di commit di SVN o alle funzionalità "propset" che possono, ad esempio, aggiornare un numero di versione o un avviso di copyright all'interno di un file ogni volta che viene inserito nel repository.

Ci si aspetta che gli utenti Git scrivano script esterni per questo tipo di funzionalità (il che non sembra fuori questione) o mi sono semplicemente perso qualcosa di ovvio?

Modificare :Giusto per essere chiari, mi interessa di più, ad esempio,

svn propset svn:keywords "Author Date Id Revision" expl3.dtx

dove una stringa come questa:

$Id: expl3.dtx 780 2008-08-30 12:32:34Z morten $

viene mantenuto aggiornato con le informazioni rilevanti ogni volta che si verifica un commit.

È stato utile?

Soluzione

Citando dal Domande frequenti su Git:

Git ha l'espansione delle parole chiave?

Non consigliato.L'espansione delle parole chiave provoca tutti i tipi di strani problemi e non è comunque davvero utile, specialmente nel contesto di un SCM.Al di fuori di Git è possibile eseguire l'espansione delle parole chiave usando uno script.Lo script di esportazione del kernel Linux fa questo per impostare la variabile extra_version nel makefile.

Vedi gitattributes(5) se vuoi davvero farlo.Se la tua traduzione non è reversibile (ad es. Espansione delle parole chiave SCCS) questo può essere problematico.

Altri suggerimenti

Ho scritto a risposta abbastanza completa a questo altrove, con il codice che mostra come farlo.Un sommario:

  1. Probabilmente non vuoi farlo.Utilizzando git describe è un'alternativa ragionevole.
  2. Se hai bisogno di farlo, $Id$ E $Format$ sono abbastanza facili.
  3. Qualunque cosa più avanzata richiederà l'utilizzo gitattributes e un filtro personalizzato.Fornisco un esempio di implementazione di $Date$.

Le soluzioni basate sulle funzioni hook generalmente non sono utili, perché sporcano la copia di lavoro.

Git ha hook pre-commit e post-commit, si trovano all'interno di ciascuna directory .git/hooks.Basta modificare i file e modificarli per renderli eseguibili.

Forse la proprietà SVN più comune, "svn:ignore", viene eseguita tramite il file .gitignore, anziché tramite metadati.Temo di non avere niente di più utile per gli altri tipi di metadati.

Sebbene ci siano domande e risposte secolari.Ho pensato di inserirne uno visto che questa cosa mi infastidisce da molto tempo.

Sono abituato a elencare i file in una directory in ordine inverso (divertente, eh?).Il motivo è che vorrei vedere quali file sono stati modificati da me (o da chiunque altro) di recente.

Git rovinerà i miei piani perché quando si cambia ramo il repository locale sovrascriverà completamente i file tracciati dal (incrementale...Lo so...) copie che si trovano nel repository locale pieno.

In questo modo tutti i file estratti porteranno il timestamp dell'estrazione e non rifletteranno l'ora dell'ultima modifica.....Che fastidio.

Quindi, ho ideato una riga in bash che aggiornerà una proprietà $Date:$ all'interno di qualsiasi file CON L'ORA DELL'ULTIMA MODIFICA SECONDO QUANTO HA SUL FILE SYSTEM in modo tale che avrò uno stato immediato che informa dell'ultima modifica senza dover sfogliare il file git log , git show o qualsiasi altro strumento che fornisca i tempi di commit colpa modalità.

La seguente procedura modificherà la $Date:$ parola chiave solo nei file tracciati che verranno impegnati nel repository.Utilizza git diff --name-only che elencherà i file che sono stati modificati e nient'altro....

Utilizzo manualmente questa riga prima di eseguire il commit del codice.Una cosa però è che devo accedere alla directory root del repository prima di applicarlo.

Ecco la variante del codice per Linux (incollata come multiriga per leggibilità)

git diff --name-only | xargs stat -c "%n %Y" 2>/dev/null | \
perl -pe 's/[^[:ascii:]]//g;' | while read l; do \
   set -- $l; f=$1;  shift; d=$*; modif=`date -d "@$d"`; \
   perl -i.bak -pe 's/\$Date: [\w \d\/:,.)(+-]*\$/\$Date: '"$modif"'\$/i' $f; \
   git add $f; done

e OSX

git diff --name-only | xargs stat -f "%N %Sm" | while read l; do \
   set -- $l; f=$1; shift; d=$*; modif=`date -j -f "%b %d %T %Y" "$d"`; \
   perl -i.bak -pe 's/\$Date: [\w \d\/:,.)(+-]*\$/\$Date: '"$modif"'\$/i' $f; \
   git add $f; done
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top