Come è possibile estrarre solo i file che sono stati modificati in una serie di revisioni SVN?

StackOverflow https://stackoverflow.com/questions/320693

  •  11-07-2019
  •  | 
  •  

Domanda

È possibile eseguire il checkout solo di quei file da un repository SVN che sono stati modificati in una revisione o in un intervallo di revisioni, senza verificare alcun file che non è stato modificato?

È stato utile?

Soluzione

Il mio suggerimento è nelle stesse linee suggerite da Flolo. Ma prende una distanza. È possibile la seguente funzione di shell.

function checkout_files_in_revrange()
{
  svn_url=$1;
  start_rev=$2;
  end_rev=$3;
  for theCheckoutCanditate in `svn log -r $start_rev:$end_rev --verbose --incremental | grep "   M " | cut -f5 -d' ' | cut -f3- -d/`
  do
     svn co $svn_url/$theCheckoutCandidate -q;
  done
}

Altri suggerimenti

Esiste ora un modo diretto per ottenere solo i file modificati e non tutti.

La mia idea sarebbe: usare l'output dettagliato dell'elenco (che mostra l'ultima versione modificata), filtrarlo attraverso awk e controllare il resto. Per esempio. per cercare i file che sono cambiati nella versione 42 lo userei

VERSION=42
svn list -v -R -r $VERSION svn://... |  awk "/^[ ]*$VERSION/ {print \$7}" > files_to_checkout

E successivamente esegui un svn update -r $VERSION 'cat files_to_checkout' (o un co sull'URL, a seconda di dove eseguirai il comando).

EDIT: ancora più breve: usa il comando svn diff e sostituisci con -x e --diff-cmd il comando diff con svn co. Ciò richiede alcuni argomenti che spostano l'hacking (che non elaborerò qui), ma richiede solo una riga e nessun file intermedio (che potresti salvare anche sopra, ma che avrebbe una leggibilità dei costi)

Se usi svn log con l'opzione -v (opzione dettagliata):

svn log -r <revision> -v <path>

Otterrai un output che include i file modificati:

 r3 | ciaran | 2008-11-16 12:24:30 +0000 (Sun, 16 Nov 2008) | 1 line
Changed paths:
   A /trunk/apache/apache.conf
   A /trunk/application/controllers

Commit message goes here

Dovresti essere in grado di manipolarlo con un po 'di grepping ecc. per produrre una sequenza di comandi svn co.

Lo facciamo in uno script MSBuild:

Passaggio 1: - Utilizzare il comando diff per ottenere l'elenco dei file modificati, reindirizzare l'output in un file temporaneo nella directory di destinazione Passaggio 2: - Leggi il file temporaneo in un itemGroup

<Exec command="$(svnExecutable) diff -r $(StartRevision):$(EndRevision) $(DOUBLE_QUOTES)$(SvnRepositoryPath)/$(DOUBLE_QUOTES) --no-diff-deleted --summarize &gt; $(TempFilePath)" WorkingDirectory="$(WorkDirectory)" />

                     

Non sono completamente sicuro che sia possibile, ma puoi anche fare qualcosa del genere:

svn checkout --revision <revisionNumber> 

per ottenere una certa revisione e

svn log --revision <revisionNumber> 

per elencare tutti i file modificati in una revisione

In quasi le stesse righe suggerite dalla maggior parte delle persone, (tuttavia solo in un sistema con grep e awk), puoi ottenere l'elenco eseguendo

svn log -v --revision <revision_number> | grep "^ " | awk '{print $2}'.

Un altro modo di rispondere alla tua domanda:

Supponendo che tu abbia una copia di lavoro esistente, dovresti semplicemente usare 'svn update' nella radice della directory contenente i file che stai guardando in quanto recupera esattamente ciò che è cambiato tra la tua attuale revisione e la revisione HEAD con il minor numero possibile di dati.

I vecchi sistemi di gestione del codice sorgente come CVS e VSS hanno chiesto al server ogni file questo file è cambiato? , mentre sovversione invia semplicemente le modifiche di un albero come una singola azione. Quando passi un elenco di file per svn update non hai questo vantaggio.

Pertanto, il modo più efficiente per trasferire ciò che è cambiato è solo l'aggiornamento. Questo trasferisce solo una diff binaria delle modifiche in HEAD rispetto alla versione base della tua copia di lavoro.


Se il problema che stai cercando di risolvere è che svn update è lento, allora stiamo cercando di risolverlo per Subversion 1.7.

Questa versione introdurrà un nuovo formato di archiviazione dei dati della copia di lavoro che renderà molto più semplici le operazioni che devono bloccare un'intera copia di lavoro (come l'aggiornamento).

svn diff -r starting_revision: ending_revision_or_HEAD --summarize

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