Come si può usare sed / awk o un altro strumento per aiutare nella ricerca e sostituzione di file di dump eversione 12GB

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

  •  30-09-2019
  •  | 
  •  

Domanda

Ho una particolare situazione in cui ho bisogno di rimuovere le operazioni di una serie di commit nel repository Subversion. Intero contenuto (/ trunk / tag / rami) sono stati etichettati e successivamente rimossi quando l'errore è stato realizzato. Vorrei semplicemente usare svndumpfilter per rimuovere i nodi offendere, ma qualcuno ri-utilizzato il nome del tag male in un momento successivo in modo esclusioni basate sul percorso causerà altri problemi. Ho bisogno di modificare manualmente il file di dump che è 12GB. Ho una serie di 15 revisioni sequenziali ho bisogno di modificare, che appaiono nella discarica nel seguente formato:

Revision-number: 60338
Prop-content-length: 143
Content-length: 143

K 7
svn:log
V 41
Tagging test prior to creating xx branch
K 10
svn:author
V 7
userx
K 8
svn:date
V 27
2009-05-27T15:01:31.812916Z
PROPS-END

Node-path: test/tags/XX_8_0_FINAL
Node-kind: dir
Node-action: add
Node-copyfrom-rev: 60337
Node-copyfrom-path: test

In base a test che ho fatto, so che ho bisogno della sezione precedente per modificare nella seguente

Revision-number: 60338
Prop-content-length: 112
Content-length: 112

K 7
svn:log
V 38
This is an empty revision for padding.
K 8
svn:date
V 27
2009-05-27T15:01:31.812916Z
PROPS-END

Ci sono 14 più revisioni in cui la stessa sostituzione deve avvenire. Cercando di modificare i file manualmente VIM è seriamente impraticabile. I file di dump sono un misto di testo e binari e ASCII. Se qualcuno ha qualche awk / sed magia che mi potrebbe aiutare, sarei molto riconoscente.

È stato utile?

Soluzione 3

Ho finito per usare le seguenti operazioni:

cat dump.file | grep -C 250 "Revision-number: xxxxx"

Questo mi ha dato i numeri di riga esatta nel file del nodo-operazioni per i commit "cattivi". Ho quindi utilizzato per rimuovere sed la gamma di operazioni di nodo (per il numero di riga) per ogni commit come segue:

sed -e "123,456d" -e "234,456d"

Questo ha dimostrato di essere abbastanza veloce. Per chi è curioso, la ragione per cui ho bisogno per rimuovere questi totalmente era perché il nostro scanner repository (Atlassian Fisheye) stava prendendo giorni di tempo per indicizzare i cattivi commit. Ero utilizzando le regole di esclusione che dovuto lavorare attorno al problema, ma si è rivelato ho scoperto un insetto con regole di esclusione che dovrebbe essere risolto nella prossima release di Fisheye. Vedere: http://jira.atlassian.com/browse/FE-2752

Altri suggerimenti

Per prima cosa un grande avvertimento: sed e awk sono progettati per lavorare su file di testo puro. Se i file sono una miscela di ASCII binario e poi io non sono sicuro che il proceda in questo modo (personalmente userei Perl).

Si considera che il "Revisione numero: 60338" è ciò che si desidera utilizzare come trigger (e aiutare il cielo si se si verifica nel binario). Metti la tua sezione aggiornata ( "... Questa è una revisione vuota ...") in un file separato chiamato, per esempio, newsection. Poi:

sed -e '/^Revision-number: 60338$/r newsection' -e '/^Revision-number: 60338$/,/^Node-copyfrom-path: test$/d' bigfilename

Come su SvnDumpTool ? Potreste essere in grado di aderire alla parte iniziale "buono" con le parti in modo incrementale in dumping modificati.

fare quelle commit contengono materiale confidenziale o quello che è il motivo per rimuoverli? Perché non lasciarli nel rimuovere repository i tag / rami e il gioco è fatto. EDIT: Vigilanza che già rimosso il tag / rami ...

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