Subversion: Partenza solo i file interessati nel corso di una specifica commettono
-
13-09-2019 - |
Domanda
In Subversion, è possibile il check-out solo i file interessati nel corso di una specifica impegnano, a condizione di sapere il numero di revisione specifico?
Soluzione
Credo che un Subversion check-out può controllare solo una cartella specifica e non i singoli file. Detto questo, il comando:
svn log -r *revision* -q -v
elencherà i cambiamenti associati con la revisione specificata così si potrebbe elaborare l'output di questo comando per aiutare copiare i file da qualche parte dopo aver controllato una cartella di lavoro per la directory completa.
Altri suggerimenti
è possibile ottenere un elenco dei file modificati dopo una revisione specifica in questo modo:
svn diff -r [REVNUM]:HEAD --summarize > fileschanged.txt
quindi creare uno script per cassa ogni file nella fileschanged.txt
Credo che sia possibile che si sta utilizzando il termine "check out" qui nel suo senso CVS, cioè un "svn update". È giusto?
Se è così, allora è possibile aggiornare alla particolare revisione che si desidera:
svn update -r12345
o anche solo quei file a detta revisione:
svn update -r12345 file1 file2 file3
anche se dovrete ottenere l'elenco dei file da svn utilizzando alcuni degli altri suggerimenti.
Lo so che è un po 'offtopic ma io uso TRAC per fare questo ed esporta solo i file modificati tra 2 revisioni in un archivio con i file nella loro struttura di directory originale.
svn checkout
funziona solo a livello di directory, non il livello di file. Naturalmente, se tutti i cambiamenti in un insieme di modifiche specifiche erano dalla stessa directory, quindi è possibile eseguire la svn checkout <url> <path> -r<revid>
.
È possibile controllare l'elenco dei file infetti utilizzando svn log -q -v -r123 url
.
Se davvero solo vuole ottenere i file interessati che è possibile utilizzare svn cat urlToFile -r123 > myfile
per ogni file.
Se si utilizza una versione recente di svn è possibile verifica una cartella vuota, quindi aggiornare i file specifici.
dopo aver ricevuto la lista dei file da selezionare,
svn co --depth=empty url dest
cd dest
svn up file1 file2 file3
Modifica: praticamente la stessa soluzione, come risposta accettata qui: un file da Subversion
Ecco un modo per farlo.
svn co svn --depth vuoto: // MyRepository / mytrunk
cd mytrunk
svn diff -c [REVNUM] svn: // MyRepository / mytrunk | grep "Index:" | awk '{print $ 2}' | xargs -n 1 svn aggiornamento --parents
L'output del awk one-liner è un elenco di file è cambiato con i percorsi relativi. Come accennato in precedenza, l'aggiornamento funziona su singoli file, mentre cassa lavora su moduli. L'opzione '--parents' costringe la creazione di directory nella vostra copia di lavoro, se necessario.
Si noti che l'aggiornamento ha anche un opzione '--changelist' (almeno in v.1.7.1 +), ma non sembrano fare ciò che volevo.
Avevo bisogno di una discarica di tutti i file che avevano cambiato in un raggio di una decina di revisioni. L'ho fatto in questo modo (questi comandi potrebbero non essere perfetta, questa è solo una spiegazione generale):
Crea un diff che vi mostrerà i file necessari e scrivere l'elenco in un file di testo
svn diff --summarize -r219:232 > r219-232_Summary.txt
Questo vi darà un file di testo con le linee come
M path/to/file.php
Massaggiare il formato di file per sostituire all'inizio di ogni riga con un comando 'svn up', invece di 'A' o 'M' o qualsiasi altra cosa.
sed -i 's/A /svn up /g' ./r219-232_Summary.txt
... che vi darà le linee come
svn up path/to/file.php
Crea una nuova directory e controllare il vostro progetto ad esso
svn co http://www.repo.net/whatever
Rimuovi tutto nella directory tranne il file .svn (sto usando un relativamente recente client SVN quindi se siete su un vecchio client svn che ha uno svn in ogni directory, non so come che funzionerà)
rm -rf ./*
Copia nel file di testo, renderlo eseguibile, ed eseguirlo come uno script.
cp /path/to/wherever/r219-232_Summary.txt ./r219-232_Summary.sh
chmod 777 ./r219-232_Summary.sh
./r219-232_Summary.sh
Se tutto va come previsto, quindi shell dovrebbe analizzare ogni 'svn up' comando nel file di testo e popolare la directory con solo i file che vi interessano.
Ecco una versione semplice script bash. Ho usato un "modello di ricerca" per rimuovere le linee non necessarie. Revisione, indirizzo repository e percorso di destinazione sono dati come argomenti ma potrebbe essere hardcoded.
#!/bin/bash
REVISION=${1}
REPOSITORY="${2}"
DEST_PATH="${3}"
SEARCH_PATTERN="trunk"
FILES=$(svn log -q -v $REPOSITORY -r $REVISION | grep $SEARCH_PATTERN)
mkdir -p $DEST_PATH
for FILE in $FILES ; do
if [[ $FILE == *"$SEARCH_PATTERN"* ]]
then
FOLDER=$(dirname $FILE)
mkdir -p $DEST_PATH/$FOLDER
svn export -r $REVISION $REPOSITORY/$FILE $DEST_PATH/$FOLDER
fi
done
#EOF
È possibile ottenere solo l'elenco dei file in una particolare modifica utilizzando
svn log -v -q -r rev
È quindi possibile ripulire gli indicatori sulla parte anteriore della linea con un tubo come
sed -e "s/^ . / /" | egrep -v "Changed paths:|-----"
. Al fine di ottenere solo i file, si sarebbe probabilmente utilizzare svn cat
come suggerito da Nikolai.
[A cura di pulizia e semplificare la pipeline sed.]
Siamo spiacenti di far risorgere una domanda morto da tempo, ma non è mai risposto alla mia soddisfazione.
Si può costruire un semplice strumento per fare questo per voi utilizzando svnkit. Ho trovato questo su di esso, e leggermente modificato il codice per le mie esigenze. Sto usando per questo giorno nel mio processo di distribuzione.
Si fa un non esportare un checkout, ma sono sicuro che sarebbe un semplice cambiamento.
svn mergeinfo --show-giri http: //base.com.rev1 http: //base.com.rev2
Questo darà un sacco di revisioni
Ora si vuoi vedere l'elenco dei file in ogni revisione. Quindi prendere la lista di revisione e di copiare nel blocco note o EditPlus e modificare in modo che si inseriscono in una sola riga
svn log -r r33521 -r33762 -3456 -r5623 -q -v >> missedFiles.txt
Nota: ho avuto 118 revisioni e non ero in grado di ottenere l'elenco dei file in modo corretto. Così ho eseguito il comando precedente rompendo in sottoinsiemi di revisione