2012-03-05 11 views
5

Per motivi oscuri (ma validi), ho bisogno di scoprire se un file è mai stato versionato nel nostro repository.Come faccio a sapere se un file è mai esistito in una svn-repo?

ho trovato solo un modo indiretto di ottenere il registro per il dir che contiene e poi analizzarlo per le voci rimosse:

svn log -v a/b/|grep " D .*a/b/c.xml" 

Funziona, ma si sente "impuro" e un po 'fragile.

+0

svn log -q -v | nome file grep | wc -l –

risposta

4

In base alla tua domanda, stai implicitamente qualificando la tua richiesta a file cancellati (perché presumibilmente se non viene cancellato una semplice ricerca di directory lo rivelerebbe). Il commento di Pigro Badger è degno: rimuovere la qualifica senza perdere precisione e semplificando così il comando. Sono tutto a favore della semplificazione ma, considerato il problema, mi piace anche considerare di ottenere di più da una soluzione con un piccolo costo aggiuntivo.

Quindi, a partire con la soluzione proposta:

svn log -v a/b/ | grep " D .*a/b/c.xml" 

Desidero in primo luogo aggiungere l'opzione -q, che ha ridotto in uscita che si sta solo scartando ogni caso:

svn log -v -q a/b/ | grep " D .*a/b/c.xml" 

E poi vorrei per sapere non solo se c'era un tale file cancellato ma anche quando è stato cancellato (cioè in quale revisione). Dal momento che anche implicitamente qualificato l'ambiente per Unix/Linux, ecco una soluzione con awk (adattato da questa blog entry):

svn log -q -v a/b/ | awk ' 
    /^r[0-9]* \|/ { REVISION=$1; } 
    /D/ { print REVISION": "$0; } 
' | grep " D .*a/b/c.xml" 

che funziona a causa del formato del svn log uscita quando viene utilizzato il parametro –v: si riporta una revisione seguita da tutti i file in quella revisione. Ecco un esempio che mostra che il file Page.cs stato eliminato nella revisione 10506:

r10506 | msorens | 2011-02-14 12:58:56 -0800 (Mon, 14 Feb 2011) | 1 line 
Changed paths: 
    A /Projects/Test/Common 
    A /Projects/Test/Common/Setup.cs 
    A /Projects/Test/Common/Utility.cs 
    D /Projects/Test/Page.cs 

I comandi awk di cui sopra uscita parse in questo formato l'estrazione del numero di revisione dalla riga superiore, allora tutti i file contrassegnati come eliminati (il “D " Linee). Per Windows, PowerShell fornisce la stessa potenza e facilità d'uso come awk utilizzando l'istruzione switch:

$(switch -Regex (svn log -q -v a/b) { 
    '^(r[0-9]*) \|' { $rev = $Matches[1] } 
    '^ D\s+(.*)' { "{0,-6} {1}" -f $rev, $Matches[1] } 
}) | Select-String "a/b/c.xml" 

Ma c'è un modo più semplice con TortoiseSVN --- basta aprire la finestra di log nella directory principale del tuo lavoro copia e digita il nome del file nella casella di ricerca. L'elenco delle revisioni si limita a filtrare in base a ciò che scrivi. Se mostra più di una riga di output, la revisione più recente (quella più in alto) sarà sempre quella in cui il file è stato cancellato.

0

Grazie a @ Michael Sorens risposta, ho ottenuto questo lavoro

Nel mio caso avevo bisogno di vedere quali file dove rimosso da una cartella ./assets/gfx

Ecco il codice per la shell bash in un one-liner una volta che hai il setup di ingresso, dove ogni linea è una linea di comando e 'mysearchstr' è un insieme var nella shell

mysearchstr=assets/gfx/ 
svn log -v $mysearchstr | awk '/^r[0-9]* \|/ { REVISION=$1; }/D/ { print REVISION": "$0; }' | grep menu 

volevo solo condividere come ho organizzato questa soluzione.È un rehash della risposta originale .. ma forse è utile a qualcuno per un blocco di codice conciso, facile da copiare, e ribadisce che la risposta alla soluzione reale (comunque qualcuno lo implementa) è in realtà corretta

Problemi correlati