2009-03-16 10 views
8

Ho creato un file chiamato version.ini sotto controllo di versione (/trunk/version.ini) ora volevo fare un hook di commit post per aggiornare quel file con ultima versione. Ma non so quale comando possa farlo. So che ho questo param:post commit hook per aggiornare un file con la versione

#!/bin/sh 

REPOS = "$1" 
REV = "$2" 

Ma come posso sostituire il contenuto di quel file senza fare una nuova revisione? e hanno ancora quei cambiamenti nel mio repo?

UPDATE: Dato forse i havent stato chiaro cercherò un explination più dettagliata: Diciamo che ho questo repo:/svn/repos/progetto/trunk/e in essa ho un file chiamato version.ini che è sotto controllo di versione. Quello che voglio fare è che su ogni commit aggiorni quel file alla nuova revisione. Diciamo che la revisione attuale è 263 voglio che il file abbia 263 scritti in esso. E per rispondere a una risposta qui sotto non puoi usare le parole chiave poiché funzionano solo se aggiorno quel file e non voglio farlo.

Spero di avere un senso, e grazie per qualsiasi aiuto dato. Cheers

+0

La tua domanda non è chiara. I ganci servono a fare qualcosa sul lato server. L'aggiornamento di un file nel repository è un'azione da client a server. –

risposta

7

Quello che in realtà non è un modo per modificare i commit, ma qualcosa come svn:keywords. Sfortunatamente, come puoi leggere nel box "Dov'è $ GlobalRev $?" questo non fa veramente quello che vuoi. Invece, dovrai scrivere uno script per chiamare e analizzare l'output di svnversion e in qualche modo inserire il risultato nei tuoi file come parte del build.

Ora, per rispondere alla tua domanda letterale è comunque divertente pensare a ciò che si può e non si può fare in SVN script di aggancio:

Non è possibile modificare un commit da un post-commit hook

Quando viene eseguito l'hook post-commit, il commit è già stato finalizzato (come implica il nome), quindi la modifica dei file è fuori questione. Puoi solo ispezionare le modifiche a questo punto.

Non è possibile modificare impegna in attesa da un pre-commit hook sia

È possibile esaminare il contenuto di una transazione in sospeso da un pre-commit hook tramite funzione svnlook con l'interruttore --transaction , ma non puoi cambiarlo.

Se è possibile apportare modifiche arbitrarie in un hook pre-commit, è ovvio che il server deve riportare queste modifiche al client svn. Altrimenti il ​​cliente penserebbe che i suoi file siano alla revisione impegnata, mentre sono in realtà diversi. Se il client svn accetta tali modifiche segnalate, ciò comporterebbe la possibilità che il tuo lavoro venga cancellato da un commit. Sarebbe una caratteristica sorprendente avere per un sistema di controllo della versione, per dirla in modo moderato. Inutile dire che sovversione non lo consente.

5

Non c'è modo di cambiare nulla nel repository senza modificare il numero di revisione.

La soluzione è inserire special keywords (cercare svn:keywords) nel file e fare in modo che SVN li sostituisca durante il checkout. Sembrerà che questi valori provengano dal repository ma la rappresentazione del file nel repository non cambierà.

Probabilmente stai cercando $ LastChangedRevision $ (o $ Rev $ in breve).

Un'altra soluzione è quella di aggiungere una regola al tuo strumento di build/Makefile/qualunque cosa che utilizza svn info nella directory principale del progetto per determinare la revisione in corso e mette che in un file temporaneo (che è non aggiunto al tuo pronti contro termine).

+0

non funzionerà ... dato che devo modificare quel file per sostituire le parole chiave –

+0

SVN lo farà per te quando svn: le parole chiave sono impostate correttamente. –

+0

È come un filtro che consente di vedere le cose nel repository che non sono realmente lì. –

Problemi correlati