Como identificar e potencialmente remover grandes commits binários dentro de um repositório SVN?

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

  •  24-09-2019
  •  | 
  •  

Pergunta

Estou trabalhando com um repositório SVN com mais de 3 anos de idade, contém mais de 6.100 compromissos e com mais de 1,5 GB de tamanho. Quero reduzir o tamanho do repositório SVN (não estou falando do tamanho de uma exportação completa do SVN - quero dizer o repositório completo, como existiria no servidor) antes de movê -lo para um novo servidor.

O repositório atual contém o código -fonte para todos os nossos projetos de software, mas também contém arquivos binários relativamente grandes sem significado, como:

  • Instaladores completos para várias ferramentas de terceiros.
  • .jpg & .png arquivos (que são exportações não modificadas de PSDs que vivem na mesma pasta).
  • Pastas de bin e obj (que são então 'svn ignoraram' a próxima confirmação).
  • Diretórios de Resharper.

Vários desses arquivos grandes foram 'SVN excluídos' desde que foram adicionados, criando um problema adicional de identificar os maiores criminosos.

Eu quero:

  • Crie um novo repositório SVN que contenha apenas o código para todos os projetos de software - é muito importante que os arquivos copiados mantêm seu histórico de SVN a partir do antigo repositório.
  • Remova os grandes comissões e arquivos binários do repositório existente.

Um desses é possível?

Foi útil?

Solução

Você terá que usar svnadmin dump para obter um arquivo de despejo do seu repositório atual e possivelmente svndumpfilter Para processar o arquivo de despejo. Você também pode modificar manualmente o DumpFile, desde que você tenha cuidado.

Provavelmente não será um trabalho rápido e fácil, mas pode ser feito. Eu fiz algo semelhante, apenas a um repositório muito menor. Eu tinha um repositório com cerca de 150 revisões que levaram cerca de 600 MB.

Faça um despejo do seu repositório atual, faça as alterações necessárias e tente carregar o DumpFile modificado em um novo repositório. Em seguida, verifique o novo repositório para garantir que tudo ainda esteja fazendo sentido (a história ainda está correta, sem alterações estranhas nos caminhos, ...).

Outras dicas

Outros estão certos sobre svnadmin dump, etc. algo assim lhe dará um ponteiro difícil para revisões que adicionaram muitos dados ao seu repositório e são candidatos a 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

Você também pode tentar algo assim para encontrar revisões que adicionaram arquivos com uma extensão específica (aqui, .jpg):

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

Se você excluiu arquivos do repositório usando "SVN Delete", você realmente não excluiu os arquivos. Esta seria a beleza do SVN. Depois que um arquivo é adicionado ao repositório, ele estará lá para sempre (a menos que use dump e carga). Ao "excluir" os arquivos, você realmente cria uma nova revisão que marca a exclusão, mas os arquivos continuam a existir em revisões anteriores.

Eu fiz um despejo e carga, mas para um repositório muito maior. Cerca de 60.000 (!!!) revisões. Levou tempo, mas no final, após um carregamento cuidadoso, o repositório é novamente construído.

Sua única maneira é listar as revisões que os arquivos foram adicionados, modificados e excluídos. Em seguida, despeje as revisões no meio e carregue -as na ordem certa. Esteja ciente, não há espaço para erros. Se você cometer um erro, terá que começar de novo. Despejar e carregar desde o início.

Minha sugestão, se os arquivos grandes forem um problema, considere criar um repositório recém -fresco sem histórico. Mantenha o antigo para a comparação da história e comece a trabalhar com o Fresh.

Boa sorte.

Se você só precisa encontrar os compensações ofensivas e Você tem acesso ao servidor que hospeda o repositório: procure arquivos grandes no subdiretório DB/Revs do repositório (supondo que ele use o formato FSFS).

Não é apenas um problema diferente, com uma etapa extra? Ou seja, você precisa localizar arquivos que considera grandes e binários e, em seguida, verifique se eles são realmente gerenciados pelo SVN ou foram construídos localmente (ou importados do sistema de ativos paralelos, se já estiver no lugar).

Então, basta encontrar os arquivos, então faça svn info sobre eles para descobrir se fazem parte do repositório.

Apenas um pequeno pensamento, você diz que o estado atual do repositório (a cabeça atual) é boa, ou seja, os grandes arquivos binários foram excluídos no passado. Portanto, seu problema é puramente do tamanho do repositório?

Eu sei que você disse que gostaria de manter todo o histórico de compromissos, mas, como opção, pode fazer dois lixões, um para todo o histórico de revisão e outro para a atual revisão da cabeça.

Se você colocar o despejo completo em um DVD, por exemplo, terá os dados disponíveis se precisasse, mas poderá excluir todo o repositório e o SVN carregar o despejo de revisão, deixando você com um pequeno repositório limpo.

Também é possível despejar a partir de uma revisão específica, em vez de apenas a cabeça, por exemplo, você pode manter os últimos 3 meses de revisões e despejar tudo mais antigo em um DVD ....

Elaborando a resposta de outras pessoas, eis o que funcionou especificamente para mim:

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

Você pode excluir o seu Obj e Bin diretórios adicionando -os ao svndumpfilter Comando - eu não tentei.

Além disso, subversão fsfs-stats programa (novo em subversão 1.8, substituído por 1.9 por svnfsfs stats) pode ser útil para quantificar os tipos de arquivos e arquivos específicos que estão preenchendo seu repositório.

Isso pode ser útil para comparar os repositórios depois:

colordiff -u <(svn log -v file:///.../old-repo ) <(svn log -v file:///.../new-repo)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top