Come identificare e potenzialmente rimuovere grandi commit binari all'interno di un repository SVN?

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

  •  24-09-2019
  •  | 
  •  

Domanda

Sto lavorando con un repository SVN che è più di 3 anni, contiene oltre 6.100 commit ed è superiore a 1,5 GB di dimensione. Voglio ridurre le dimensioni del repository SVN. (Non sto parlando delle dimensioni di un'esportazione completa SVN - intendo la piena repository come sarebbe esistere sul server) prima di passare a un nuovo server

L'archivio corrente contiene il codice sorgente di tutti i nostri progetti software ma contiene anche relativamente grandi file binari di alcun significato come ad esempio:

  • installatori pieno per un certo numero di strumenti 3rd party.
  • .jpg e .png file (che sono le esportazioni non modificate del PSD che vivono nella stessa cartella).
  • Bin e obj cartelle (che sono poi 'svn ignorato' il prossimo commit).
  • directory ReSharper.

Un certo numero di questi file di grandi dimensioni sono stati 'SVN cancellato' da quando sono stati aggiunti, creando un ulteriore problema di identifing più grandi trasgressori.

Voglio uno:

  • Creare un nuovo repository SVN che contiene solo il codice per tutti i progetti software -. È veramente importante che i file copiati mantengono la loro storia SVN dal vecchio repository
  • Rimuovere le grandi commit binari e file dal repository esistente.

Sono uno di questi possibili?

È stato utile?

Soluzione

Si dovrà utilizzare svnadmin dump per ottenere un file di dump del repository corrente e, eventualmente, svndumpfilter per elaborare il file dump. È inoltre possibile modificare manualmente il file di dump, come fino a quando sei attento.

E 'probabilmente non sarà un lavoro facile e veloce, ma può essere fatto. Ho fatto qualcosa di simile, solo per un repository molto più piccolo. Ho avuto un pronti contro termine con circa 150 revisioni che ci sono voluti circa 600MB.

Fare una discarica dal repository corrente, apportare le modifiche necessarie e cercare di caricare il file di dump modificato in un nuovo repository. Poi controlla il nuovo repository per assicurarsi che tutto è ancora dare un senso (La storia è ancora corretta, nessun cambiamento nei percorsi strani, ...).

Altri suggerimenti

Otherside ha ragione su svnadmin dump, ecc Qualcosa del genere ti porterà un puntatore di massima per le revisioni che un sacco di dati aggiunti al pronti contro termine, e sono candidati per svndumpfilter:

for r in `svn log -q | grep ^r | cut -d ' ' -f 1 | tr -d r`; do
   echo "revision $r is " `svn diff -c $r | wc -c` " bytes";
done

Si potrebbe anche provare qualcosa di simile per trovare le revisioni che hanno aggiunto i file con una particolare estensione (qui, .jpg):

svn log -vq | egrep "^r|\.jpg$" | grep -B 1 "\.jpg$"

Se avete cancellato i file dal repository utilizzando "SVN Cancella", ha in realtà non ha cancellato i file. Questa sarebbe la bellezza del SVN. Una volta che un file viene aggiunto al repository, è lì per sempre (a meno di utilizzare discarica e carico). Su "eliminazione" dei file, in realtà crea una nuova revisione che segna la cancellazione, ma i file continuano ad esistere nelle revisioni precedenti.

Ho fatto qualche discarica e carico, ma in un repository molto molto più grande. Circa 60.000 (!!!) le revisioni. C'è voluto tempo, ma alla fine, dopo un attento carico, il repository è di nuovo costruito.

Il tuo unico modo è quello di elencare le revisioni che sono stati aggiunti, modificati e cancellati i file. Poi eseguire il dump dei revisioni in mezzo, e caricarli nel giusto ordine. Attenzione, non c'è spazio per gli errori. Se si commette un errore, si dovrà ricominciare da capo. Dump & carico fin dall'inizio.

Il mio suggerimento, se i file di grandi dimensioni sono tale problema una, prendere in considerazione la creazione di un repository appena fresco senza storia. Mantenere il vecchio per il confronto la storia, e iniziare a lavorare da fresco.

Buona fortuna.

Se avete solo bisogno di trovare i commit offendere e si ha accesso al server che ospita il repository: look per file di grandi dimensioni in db / giri sottodirectory del repository (ammesso che utilizza il formato fsfs).

Non è questo solo un problema diverso, con un passo in più? Cioè è necessario individuare i file che si considera di essere grande e binario, e quindi verificare se sono effettivamente gestiti da SVN o sono stati costruiti a livello locale (o importati dal sistema di asset in parallelo, se è già in atto).

Quindi, basta trovare i file, quindi fare svn info su di loro per scoprire se sono parte del repository sono.

Solo un piccolo pensiero, si dice che lo stato corrente del repository (l'attuale capo) è buono, vale a dire i grandi file binari sono stati svn delete'ed in passato. Quindi il problema è puramente la dimensione del repository?

So che hai detto che si desidera mantenere tutta la storia commit, ma come opzione, si potrebbe fare due discariche, una per tutta la cronologia delle revisioni, e uno per la revisione attuale capo.

Se si mette il dump completo su un DVD per esempio si avrebbe i dati disponibili, se mai bisogno, ma si potrebbe quindi cancellare l'intero repository e SVN caricare il dump di revisione, lasciando con un piccolo repository pulito.

è anche possibile fare uscire da una specifica versione in poi, piuttosto che solo la testa, così per esempio si potrebbe mantenere gli ultimi 3 mesi di revisioni e discarica tutto anziani su un DVD ....

Elaborando risposta di Otherside, ecco quello che specificamente ha funzionato per me:

svnadmin create new-repo
svnadmin dump old-repo | svndumpfilter exclude --pattern '*.exe' '*.jpg' '*.png' | svnadmin load new-repo

Si potrebbe essere in grado di escludere i tuoi Obj e Bin directory aggiungendoli al comando svndumpfilter -. Non ho provato che

Inoltre, il programma fsfs-stats di Subversion (nuova in Subversion 1.8, sostituito da nell'1,9 per svnfsfs stats) potrebbe essere utile per quantificare i tipi di file e file specifici che stanno riempiendo il vostro repository.

Questo potrebbe essere utile per confrontare i repository in seguito:

colordiff -u <(svn log -v file:///.../old-repo ) <(svn log -v file:///.../new-repo)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top