2010-11-17 10 views
7

Desidero eseguire un aggiornamento svn a una data specifica e posso farlo con svn update -r {2010-10-17}. Sfortunatamente quando questo incontra un esterno lo farà all'interno dell'esterno senza passare attraverso l'opzione -r {2010-10-17}. Questo ci porta a ottenere la corretta revisione del codice base, ma le versioni più recenti (indesiderate) di molti dei componenti esterni.Aggiornamento svn checkout a una data specifica inclusi esterni

Come posso aggiornare ad una revisione specifica o una data e fare in modo che questo riceva correttamente attraverso le esternazioni?

(Nota: ho capito che l'errore qui potrebbe essere stata quella di utilizzare gli esterni senza revisioni espliciti specificati.)

+1

Hai visto questo: http://stackoverflow.com/questions/683716/subversion-update-externals-to-a-date –

risposta

4

Spero che qualcuno implementerà la logica del senso comune (limitata agli esterni di tipo directory in alcune aree) in bash e script cmd prima o poi e otterremo "risposta definitiva" a questa domanda ricorrente

vostro compito base è:

  • svn up il tuo super-repo a punto necessaria in passato (l'aggiornamento alla data/e senza tempo/è, BTW, non una scelta migliore, ma - apllicable)
  • ottenere un elenco di percorsi per tutti gli esterni del progetto (perché le definizioni esterne possono esistere ovunque nell'albero), da WC-root svn propget svn:externals -R (-R per controllare l'intero albero senza molto)
  • per ogni stringa nell'output di proprietà (con un formato come questo . - https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/lib lib): cd a l'ultimo campo di corda/parente di primo campo, che è, a sua volta, è percorso relativo alla root/e svn fino allo stesso punto, come è stato fatto per superrepo: svn update -r {2010-10-17}

come risultato' Avremo una copia di lavoro mista, ma superrepo ed esterni saranno in stato "per qualche revisione in passato"

Nota:

Esempio aggiuntivo per la costruzione di un percorso locale verso la directory con esterni (il WC nidificato in realtà) su un caso più complesso.

Per

>svn propget svn:externals -R 
tags\1.0.1 - -r 2 https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/[email protected] lib 

trunk - https://subversion.assembla.com/svn/subversion-trouble-shooting/trunk/lib lib 

finali percorsi esterni nella mia WC sarà (relativamente al WC-root)

tags\1.0.1\lib 
trunk\lib 
-3

Per quanto sono stato in grado di lavorare fuori, non si può fare questo senza cambiare la tua configurazione esterna. Ma cambiare la configurazione esterna lo cambia per tutti, quindi è solo un singolo commit e aggiornamento e il gioco è fatto.

+1

Puoi spiegare cos'è una "configurazione esterna"? Intendi la proprietà svn: externals? Se vuoi dire che le nostre proprietà ESTERNI dovrebbero utilizzare i numeri di revisione espliciti, allora sì mi può essere d'accordo con te, ma non posso tornare indietro e modificare i molti commit per i quali questo non era il caso. Forse ho frainteso il tuo suggerimento. – pauldoo

+0

Siamo spiacenti, si, la proprietà svn: externals. Lo hai solo in uno o due posti giusto? Anche se, ora rileggendo la tua domanda, si vuole andare indietro nel tempo, che reimpostare la proprietà svn: gli esterni anche. Quindi sì, si dovrebbe avere utilizzato revisioni esplicite tuoi esterni, e ora si sta andando ad avere a che fare manualmente :) –

+0

Non scrivere delirio –

0

Sto aggiungendo questa risposta nel caso qualcuno sta cercando di aggiornamento un già -checked-out repository di subversion per sincronizzare le date del file locale con le date del repository, che volevo fare in modo che potessi fare confronti con il timestamp di FS.

ho fatto questo oneliner fare il trucco (ma leggere la riga in basso prima di utilizzarlo):

svn info --show-item last-changed-date -R | xargs -I{} -P1000 -n1 sh -c 'x="{}"; set -x; exec touch -d "${x%% *}" "${x#* }"'

NOTA: Il -P1000 specifica che xargs dovrebbe funzionare copie simultanee di sh e touch per eseguire l'aggiornamento effettivo. A seconda del carico del sistema, potrebbe essere opportuno abbassarlo. Su un piccolo processore Intel NUC 1000 basato su i3, in realtà si è rivelato perfetto, usando l'80-95% di CPU (il 100% in genere significa che la CPU è sovraccaricata). In caso di dubbio, apri, ad esempio, htop e prova con valori diversi, ma eseguilo solo per pochi secondi, poiché ogni volta dovrà essere eseguito dall'inizio.

Per un piccolo repo SVN da 3 GB su un HDD USB, ci sono voluti circa 5 minuti per funzionare.

Il set +x attiva l'esecuzione dettagliata, che eseguo appena prima di eseguire touch in modo da poterlo controllare. Se si desidera un'esecuzione non dettagliata, rimuovere tale comando.

Problemi correlati