2013-03-14 12 views
5

Sto pianificando il passaggio della mia azienda da CVS a Git, e alcuni ingegneri stanno sperando di utilizzare ancora stringhe di parole chiave CVS come $Id: $. Ho letto tutto sull'implementazione di questo con l'ident impostazione .gitattributes, e capisco perché non è auspicabile, anche se forse è possibile per alberi di sorgenti più piccoli. (La nostra fonte è enorme, quindi penso che sarebbe impossibile.)Un approccio diverso alle stringhe ident-style in Git?

I nostri ingegneri non si preoccupano particolarmente di avere l'hash SHA1 nel file. Vogliono solo sapere:

  1. la data dell'ultima modifica
  2. il nome del committer
  3. forse il messaggio

Lo trovano estremamente utile per vedere queste informazioni nelle intestazioni dei file commettere durante la navigazione del codice, e non posso discuterne.

Quello che voglio sapere è:

Esiste un modo per info-timbro tutti i file in scena al momento prima di git commit? In altre parole, per eseguire un comando perl, che sostituisce $Id: $ con un blocco di informazioni desiderate, sulle copie di lavoro dei file in corso di commit?

Ciò non richiederebbe alcuna azione .gitattributes. Git avrebbe solo bisogno di sapere come unire due blocchi di informazioni di questo tipo, idealmente scegliendo quello successivo. Le informazioni stampate sarebbero solo un altro cambio di file nella versione appena creata.

Ho cercato di farlo nel gancio di pre-commit, ma sembra essere destinato in modo diverso - non per modificare i file, solo per controllarli. Ho ragione su questo?

E nessuno ha provato questo approccio? Mi sembra più semplice che cercare di filtrare tutti i file sorgente ogni volta che git cambia versione, che fa quello che sembra fare .gitattributes.

Molto grazie per eventuali consigli/avvertenze/indicazioni.

+0

Aye! Sono uno di loro, questi ingegneri, amico! – Roboprog

risposta

3

RCS (e quindi CVS) esegue l'espansione di $Id:$ e così via checkout, quelli non sono nei file salvati. E non possono essere davvero, qualcuno potrebbe venire in giro e rinominare la versione 1.8.2-rc10 in chiaro 1.8.2. Se qualcuno vuole sapere da dove proviene il numero file, le risposte git log file vanno bene, con ulteriori dettagli di che RCS potrebbe mai fornire. Ed è un comando locale, nessun viaggio al server CVS (e quindi disponibile ovunque sia git e istantaneo).

+1

Ancora una volta, non sono le versioni che ci interessa aggiungere al file. Vogliamo solo la data di modifica più recente e il nome dell'editor. È una brutta cosa da aggiungere al file al check-in? –

+0

Ottieni questo (e molto altro) come dico io ... 'git' è _differente_ rispetto a CVS, non aspettarti che funzioni allo stesso modo. – vonbrand

+1

Spiegami come "foo log file" (git | svn | cvs) mi dice qualcosa su un file copiato dal workspace di controllo del codice sorgente e distribuito in test o in produzione ??? Se * I * ha fatto la copia, non ho bisogno di sapere, è quando * qualcun altro * lo rovina, e poi * devi * disperatamente * sapere. – Roboprog

3

La sezione Keyword Expansion di git documentation spiega come effettuare l'espansione di parole chiave pulite.

sceneggiatura rubino per ampliare quello che vuoi sarebbe qualcosa di simile (non testato)

#! /usr/bin/env ruby 
data = STDIN.read 
last_info = `git log --pretty=format:"%ad %cn %s" -1` 
puts data.gsub('$Last$', '$Last: ' + last_info.to_s + '$') 

filtro configurazione

$ git config filter.last_expander.smudge expand_last_info 
$ git config filter.last_expander.clean 'perl -pe "s/\\\$Last[^\\\$]*\\\$/\\\$Last\\\$/"' 

setup.gitattributes

echo '*.txt filter=last_expander' >> .gitattributes 

Nota: (proprio come dice vonbrand) ciò che questo ti dà, e ciò che si desidera in tutte le likelyhood, è l'espansione campo su cassa e la rimozione dei campi commettere. Ma l'effetto è che i tuoi ingegneri saranno in grado di leggere il campo nei file estratti nella loro directory di lavoro. Non è quello che vogliono? E questo non rovinerà il contenuto in versione reale con i metadati ridondanti.

+0

Mi sto chiedendo specificatamente di aggiungere/aggiornare i campi al check-in e di non dover fare nulla alla cassa. Non capisco cosa c'è di male in questo. Dovendo macchiare/pulire ogni file nel repository ad ogni checkout/check-in sarà molto lento per noi. (Questa è la mia comprensione dell'elaborazione degli attributi Git - sbaglio?) –

+0

Penso che sto parlando di avere il filtro 'pulito' per riempire o aggiornare il simbolo del Tema Infostamp nei file e di non avere alcun filtro 'sbavature' . Sembra che funzionerebbe, ma nessuno lo fa in questo modo ... Non capisco perché no. –

+0

Una cosa che sarebbe sicuramente pessima è che aggiornare questi campi ad ogni commit significa che sarebbero diversi per ogni versione del file. Ciò significa che si visualizzeranno in ogni diff di ogni versione del file. Significa anche che questi campi creerebbero un conflitto di unione, per * tutti * si fondono. E perché è importante che questi campi vengano commessi?Non è importante che gli ingegneri possano vedere i campi nei file estratti, nella loro directory di lavoro? Non possono facilmente vedere cosa c'è nel repository. –

0

Ecco come risolvere questo:

  1. Aggiungere il gancio seguenti pre-commit:

    #!/bin/sh 
    git diff --cached --name-only -z --diff-filter=ACM | 
         xargs -r0 .filters/keywords -- 
    git diff --cached --name-only -z --diff-filter=ACM | 
         xargs -r0 git add -u -v -- 
    
  2. Aggiungere la seguente hook commit-msg:

    #!/bin/sh 
    awk '!/^[[:space:]]*(#|$)/{exit f++}END{exit !f}' "$1" && exit 
    # NOTREACHED unless commit was aborted 
    git diff --cached --name-only -z --diff-filter=ACM | 
         xargs -r0 .filters/keywords -d -- 
    git diff --cached --name-only -z --diff-filter=ACM | 
         xargs -r0 git add -u -v -- 
    
  3. Scarica ".filters/fraubsd-keywords" ma rinomina il file in "parole chiave":

    https://raw.githubusercontent.com/freebsdfrau/FrauBSD/master/.filters/fraubsd-keywords

  4. Modifica "parole chiave", che cambiano nella sezione di configurazione in alto:

    • FrauBSD di intestazione
    • _FrauBSD a _header

Dopo di che, ogni tempo di fare un git commit il testo $Header$ e/o $Header: ... $ sarà tradotto in $Header: file YYYY-MM-DD HH:MM:SS GMTOFFSET committer $

NOTA: potrebbe essere necessario modificare una piccola sezione dello script "Parole chiave" per operare su più tipi di file. Al momento della stesura di questo documento funziona solo su file "ASCII text" o "shell scripts".

Problemi correlati