Procura por checkins grandes em um repositório do subversion

5

No passado, as pessoas faziam o check in de arquivos massivos para o nosso repositório de subversão e mais tarde lamentavam. Para consertá-lo, eles simplesmente excluíram o diretório e fizeram outro checkin (deixando os arquivos massivos no histórico do repositório).

Como esses arquivos enormes eram acidentes e não pretendiam estar no histórico, eu queria filtrá-los usando o svndumpfilter. Existe alguma maneira fácil de encontrar grandes diretórios que foram verificados? Talvez classificar as diferenças de revisão por tamanho?

    
por Nick Sonneveld 07.07.2009 / 05:22

1 resposta

7

Eu basicamente achei analisando o arquivo svndump e usando um pequeno script python:

$ # dump repository to file
$ svnadmin dump /var/lib/svn/ > svn_full_dump.txt

$ # find byte offsets of 'Revision-number' and save in file
$ egrep -bo  '^Revision-number: .+$' svn_full_dump.txt > revisions.txt

$ head revisions.txt 
75:Revision-number: 0
195:Revision-number: 1
664:Revision-number: 2
863:Revision-number: 3
1058:Revision-number: 4
1254:Revision-number: 5
1858:Revision-number: 6

$ # find size of checkins and sort by size
$ python revision_size.py  | sort -nr | head
1971768485 r1528
44453981 r2375
39073877 r1507
34731033 r2394
30499012 r484
...

O arquivo python é:

#!/usr/bin/env python

f = file('revisions.txt')

last_offset = 0
last_revision = None

for l in f:
    l = l.strip()
    (offset, middle, revision) = l.split(':')
    offset = int(offset.strip())

    revision_size = offset-last_offset
    if last_revision:
        print '%s r%s'%(revision_size, last_revision.strip())

    last_revision = revision
    last_offset = offset

# will ignore last revision

f.close()

update: corrigiu um bug no script revision_size, em que o tamanho não era compatível com a revisão correta.

    
por 07.07.2009 / 05:48

Tags