Domanda

Nella mia applicazione web ho un file che contiene il numero di revisione corrente tramite $Rev$.Funziona bene, tranne che, se non apporto modifiche a quel file, non viene eseguito il commit.

Esiste comunque la possibilità di forzare un singolo file a essere sempre impegnato sul server SVN?

Sto utilizzando TortoiseSVN per Windows, quindi qualsiasi codice o istruzioni dettagliate sarebbero utili.

È stato utile?

Soluzione

Se hai installato TortoiseSVN, hai anche a disposizione lo strumento SubWCRev.Utilizza questo strumento per ottenere la revisione invece di utilizzare in modo improprio la parola chiave $REV$.

  1. crea un file modello che contenga le tue definizioni, forse qualcosa del genere

    const lungo WC_REV = $WCREV$;

    in un file denominato versione.h.tmpl

  2. su ogni build, chiama SubWCRev per creare il file "reale" che puoi utilizzare nella tua applicazione:

    SubWCRev percorso\a\workingcopy percorso\a\versione.h.tmpl percorso\a\versione.h

Questo creerà il file versione.h da versione.h.tmpl, con il testo $WCREV$ sostituito con la revisione a cui si trova attualmente la tua copia di lavoro.

IL documenti per SubWCRev potrebbe anche aiutare.

Altri suggerimenti

Fondamentalmente, vuoi l'output di svnversion comando in un file.

Tali file vengono solitamente tenuti fuori dal repository e creati automaticamente da uno script di build.Ti suggerisco di fare lo stesso.Se non costruisci, ma solo a svn up dal lato server, basta chiamare svnversion Dopo svn up oppure crea uno script di shell per eseguire entrambe le azioni.

Se tu Avere per mantenerlo nel repository invece, chiamando svnversion in un hook pre-commit sarebbe la soluzione migliore.

Penso che potresti non capire come funziona il flag $Rev$.L'obiettivo del flag Rev non è quello di avere questa revisione sempre inserita nel repository subversion.L'obiettivo è che durante un aggiornamento, il flag Rev sarà sempre quello della revisione. Non dovrebbe essere necessario inserire in subversion il codice che contiene la revisione. Subversion è molto bravo a tenere traccia di queste informazioni per te.

Ciò che probabilmente ti è sfuggito è che devi impostare una proprietà sul file in modo che la parola chiave Revision venga elaborata correttamente.

svn propset svn:keywords "Revision" file.txt

Ciò garantirà che ogni volta che esegui un aggiornamento, $Rev:Il flag xxx$ verrà aggiornato con la revisione corrente.Non devi preoccuparti di come viene assegnato al repository.

@gatekiller:Sembra che TortoiseSVN supporti Ganci lato cliente.

Funziona bene, tranne che, se non apporto modifiche a quel file, non viene eseguito il commit.

Se il file non cambia mai, perché dovresti averne bisogno ogni volta?

Modifica] @Sean = Capisco cosa sta cercando di fare, ma se il file non viene mai aggiornato tramite un gancio o qualche altro processo e quindi non cambia mai, SVN non lo raccoglierà mai.

Suggerisco di cambiare approccio, impegnare un file ogni volta significa mantenere implicitamente il numero di revisione globale in quel file.L'utente potrebbe aver bisogno di un'altra parola chiave, GlobalKey, di cui si spiega l'inesistenza Qui In realtà non ho usato menzionato svnversion tuttavia, potrebbe portarti a una soluzione.

Il file del numero di revisione potrebbe essere modificato da uno script che distribuisce il tuo sito Web da SVN al server Web?

Non sono sicuro su Windows, ma usando uno script bash, farei qualcosa del tipo...

$ version=$(svnversion)
$ svn export . /tmp/staging/
Export complete.
$ echo "Revision: ${version}" > /tmp/staging/version.txt

Poi /tmp/staging/version.txt conterrebbe "Revisione:1" (o qualunque sia il numero di revisione più alto).

Ovviamente potresti sostituire qualche identificatore in un file, come $Rev$ (invece di creare version.txt come nell'esempio sopra)

A seconda del cliente, alcuni offrono un hook di pre-commit che consente di implementare qualcosa che semplicemente "tocca" il file e lo contrassegna come modificato.Se utilizzi qualcosa come Visual Studio potresti creare un'attività post build che "toccherebbe" il file ma dovresti assicurarti di eseguire una build prima di apportare modifiche.

@gradonmantank:Perché vuole che quel file venga aggiornato con l'ultimo numero di revisione.Hai letto completamente la sua domanda?

L'hook pre-commit potrebbe funzionare.

Avevo un modo manuale per farlo.Eseguirei uno script che utilizzerebbe sed per sostituire un commento con il timestamp corrente nel mio file $Rev$.In questo modo, il contenuto del file cambierebbe e Subversion lo committerebbe.

Ciò che non ho fatto è stato passare al passaggio successivo:utilizzando Hook del repository di Subversion per automatizzare il processo.Il problema è che non sono sicuro che ti sia consentito modificare il contenuto dei file negli hook.La documentazione sembra suggerire che non è possibile.

Invece, immagino che avresti bisogno di un piccolo script da eseguire al posto del file svn commit comando che prima aggiorna il timestamp e poi esegue il commit normale.

Inviare il file non ti farebbe bene.Il file non contiene la versione completa, viene sostituito solo con la parola chiave.Se guardi il file all'interno del repository vedrai questo.

Pertanto, è necessario forzare l'aggiornamento del file in qualche modo.

Se utilizzi la piattaforma Windows, puoi utilizzare lo strumento SubWCRev, distribuito con TortoiseSVN.Documentazione Qui.

Puoi usare svn pre-commit-hooks per farlo.
L'idea generale che ho in mente è crearne uno che prima del commit inserisca il nuovo numero di revisione nel file (ottienilo usando svnlook) o magari cambi una proprietà fasulla sul file (deve cambiare o SVN lo ignorerà).

Per ulteriori informazioni sugli hook pre-commit che ho trovato questa pagina utile.

Penso che l'approccio migliore per garantire che nella tua applicazione web sia presente un file con il numero di revisione SVN sia quello di non avere un file che commetti, ma piuttosto di estrarlo come parte del tuo script di build.

Se usi Maven, puoi farlo con il plugin maven-buildnumber.

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