Equivalente Git dell’espansione della parola chiave $ URL $ di sovversione

Sto considerando la migrazione dalla sovversione a git. Una delle cose che usiamo sovversione per i nostri amministratori di sistema per gestire cose come i file di configurazione. A tal fine, inseriamo $URL$ in ogni file, che si espande nella posizione del file nell’albero di subversion. Ciò consente agli amministratori di guardare un file su un host arbitrario e capire da dove proviene l’albero.

L’analogo più simile che ho trovato è gitattributes. C’è il filter= direttiva, ma sembra che git non comunichi al filtro quale nome del file sta filtrando, cosa che sarebbe necessaria per trasformare $URL$ in un percorso.

C’è anche la direttiva ident , che trasformsrebbe $Id$ nel blob hash. Questo potrebbe essere utilizzabile se fosse ansible riportarlo in un percorso, ma il mio git-fu non è abbastanza forte.

Eventuali suggerimenti?

Il stream di lavoro è il seguente:

    1. L’amministratore esegue le modifiche al repository VCS
    2. L’amministratore aggiorna una posizione centrale che ha controllato il pronti contro termine
    3. L’amministratore estrae le modifiche all’host utilizzando cfengine

    Come menzionato in ” svn propset svn:keywords ha qualcosa come svn propset svn:keywords o hook pre / post-commit?” , Git non supporta l’espansione delle parole chiave.

    ” Gestire l’espansione delle parole chiave SVN con git-sv ” fornisce una soluzione basata sul git config filter (che non è esattamente quello che vuoi) e / o gitattributes .


    L’esempio più vicino se l’espansione delle informazioni sui file l’ho trovato ancora basato sull’approccio smudge / clean, con questo filtro Hash git , ma la parte pulita lo rimuove dal file e non è ansible trovare alcun percorso.

    Questo thread in realtà lo spiega (oltre a menzionare alcuni comandi di git-fu che potrebbero contenere ciò che stai cercando, non li ho testati):

    In ogni caso, macchia / pulito non dà la soluzione immediata al problema a causa di minori carenze tecniche:

    • filtro sfumino non viene passato un nome del file che viene estratto, quindi non è ansible trovare esattamente l’identificatore del commit.
      Tuttavia, questo è alleviato dal fatto che “macchia” viene eseguito solo per i file modificati, quindi l’ultimo commit è quello necessario.

    • filtro sfumino non viene passato un identificatore di commit. Questo è un po ‘più serio, in quanto questa informazione non è in nessun luogo per ottenere da altrimenti.
      Ho provato ad usare il valore “HEAD”, ma a quanto pare non è ancora stato aggiornato al momento in cui viene eseguito “macchia”, quindi i file finiscono con la data del commit “precedente” piuttosto che il commit estratto.
      “Precedente” indica il commit che è stato estratto prima. Il problema peggiora se il ramo diverso viene estratto, poiché i file ottengono il timestamp di un ramo precedente.

    AFAIR, la mancanza di informazioni nel filtro sfumino è stato intenzionale, per scoraggiare questo particolare uso del meccanismo sfumino / pulito. Tuttavia, penso che questo possa essere riconsiderato dato il caso d’uso di Peter: area di lavoro “solo check-out” per la pubblicazione immediata sul server web.
    In alternativa, chiunque sia interessato a questo caso d’uso potrebbe implementare ulteriori argomenti di sbavatura come patch locale del sito.

    E poi, ci sono piccoli fastidi, che sembrano inevitabili: se cambi il filtro “pulito” e controlli la revisione precedente, verrà segnalato che ha delle modifiche (a causa della modifica della definizione “pulita”).

    Poiché al giorno d’oggi esiste l’opzione %f , gli script come git-rcs-keywords possono svolgere questo compito.

    È già menzionato in questa risposta .

    gitattributes (5) manpage :

     Sequence "%f" on the filter command line is replaced with the name of the file the filter is working on. A filter might use this in keyword substitution. For example: [filter "p4"] clean = git-p4-filter --clean %f smudge = git-p4-filter --smudge %f 

    Venendo al problema da un’angolazione completamente diversa, come finiscono i file in questione sugli host finali? Immagino che oggi sia verificato direttamente lì, o copiato in qualche modo da un repository già estratto su un altro host?

    In tal caso, potresti modificare il tuo processo in modo che i file vengano estratti in un repository git e uno script esegua $URL$ o altre espansioni di parole chiave dopo il checkout. In questo modo puoi fare tutte le sostituzioni che ti piacciono e essere limitato solo da ciò che può essere scoperto da uno script in un repository estratto.

    Utilizziamo una soluzione “percorso canonico” nelle nostre implementazioni (sono tutte interne, FWIW).

    Tutto il software va in /d / sw / xyz / ac o D: \ SW \ xyz \ ac

    Tutti gli URL dei file distribuiti riflettono questo ad es. Http: // host / d / sw / xyz / ac .

    Gli URL dei file di repository iniziano da “sw” ad es . Git: // githost / gitrepo / xyz / ac

    Noi codifichiamo questi percorsi canonici nella configurazione (nel caso avessimo bisogno di cambiare) e abbiamo script / API che generano / fanno riferimento agli URL al volo per il collegamento dinamico tra i componenti.