Como mover uma única pasta de um repositório Subversion para outro repositório?

156

Eu tenho uma pasta "docs" em um repositório do Subversion chamado "projeto". Cheguei à conclusão de que ele realmente deve ser mantido em um repositório Subversion separado chamado "project_docs".

Gostaria de mover a pasta "docs" ( e todas as suas revisões ) para o repositório "project_docs". Existe uma maneira de fazer isso?

esquerda
fonte

Respostas:

183

Se você tiver acesso ao próprio repositório (não uma cópia de trabalho), poderá despejar o repositório atual, filtrá-lo para incluir apenas informações sobre a pasta docs e carregá-lo no outro repositório.

Seria algo como isto:

svnadmin dump /svn/old_repos > ./repository.dump
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./repository.dump > ./docs_only.dump
svnadmin load /svn/new_repos < ./docs_only.dump

Sem acesso ao repositório, você não pode manter o histórico de revisões e precisa se contentar em copiar os arquivos no novo repositório e confirmar.

Samuel
fonte
1
Belo exemplo. Observe que, conforme indicado na documentação a que vinculei, esta solução renumerará todas as revisões para que não haja "vazios". Lembre-se de algo se você fizer referência às revisões do documento em qualquer outro lugar.
236 Adam Adam Adam
1
Sugeri a remoção de revisões vazias para evitar adicionar várias revisões vazias ao repositório de destino, provavelmente confundindo qualquer um que não soubesse sobre a carga. Como --preserve-revprops manterá as mensagens de confirmação em vez de usar a mensagem padrão de carregamento.
Samuel Samuel
11
Obrigado pela resposta. Caso alguém precise saber, se você precisar de mais de uma pasta, basta colocar um espaço entre elas na lista de inclusão. Ex. ... include folderOne folderTwo
Robin Robinson
6
Renumeração revisões é provavelmente uma má idéia, como as mensagens de e ferramentas de monitoramento problema pode se referir a eles
Wim Coenen
5
Isso funcionou para mim. Eu sou um usuário do Windows (Visual SVN Server) e meu primeiro comando olhou como este, se isso ajuda qualquer um:"C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" dump c:\Repositories\MyRepository > c:\Temp\MyReository.dump
Chris
30

O svndumpfilter tem uma falha séria - se um arquivo ou caminho foi copiado de um caminho que você está filtrando para um que você está filtrando, o svndumpfilter não poderá preencher o histórico e o trabalho falhará.

Você pode usar svndumpfilter2 se tiver esse problema.

compie
fonte
4
Aqui está um link melhor para svndumpfilter2: svn.tartarus.org/sgt/svn-tools/svndumpfilter2
bmaupin
Nesse caso, você pode adicionar o caminho necessário à lista ... o mais específico possível ... e depois remover essas entradas do projeto após a importação.
James Gawron
6

Isso é discutido na documentação do SVN. Confira a seção Manutenção de Repositório em svndumpfilter... Ele descreve especificamente como despejar projetos de um repositório central e movê-los para novos repositórios separados.

Adam Bellaire
fonte
2

Não acredito que você possa fazer isso remotamente (ou seja, sem uma cópia local). Mas isso deve funcionar: svn exporta pasta do servidor original e depois svn addno seu novo repositório.

Gostar:

$ svn checkout svn://example.net/newrepo .
$ svn export svn://example.com/oldrepo/mydir ./mydir
$ svn add ./mydir; svn commit

Edit: D'oh, isso deixa cair a história. Use svnadmincomo Samuel descreve .

Peter Stone
fonte
3
No entanto, você não pode manter as revisões sem acesso ao próprio repositório. Se você só pode ter uma cópia de trabalho, é o melhor que ele pode fazer.
Samuel Samuel
2

Para referência futura:

A documentação SVN relata claramente:

Se você planeja editar manualmente o arquivo de despejo para remover um diretório de nível superior, verifique se o editor não está configurado para converter automaticamente caracteres de fim de linha no formato nativo (por exemplo, \ r \ n para \ n), pois o conteúdo não estará de acordo com os metadados. Isso tornará o arquivo de despejo inútil.

Use sed ou Vim para substituir o diretório de nível superior, mas esse nome de diretório também estava contido em um arquivo de projeto !!!! Isso causa um erro de soma de verificação de carga SVN.

Portanto, ao executar esta operação, não faça substituições de string com sed apenas do nome do caminho.

Substitua “Node-path: old_path” por “Node-path: new_path”. Veja o capítulo 5 do livro SVN “administração de repositório” para mais detalhes.

nios
fonte
1

Tentei usar a resposta aceita, mas tinha um repositório enorme e desejava exportar um diretório pequeno e não podia me dar ao luxo de despejar o repositório inteiro.

Portanto, exportei apenas as revisões em que meu diretório foi alterado (isso pode não funcionar se o diretório que você deseja exportar tiver referências a outros locais em seu repositório).

svn log URL_to_docs | awk '/^r/{gsub(/^r/,"",$1);print $1}' > revisions.txt
#tac for revisions in reverse (oldest revision first)
tac revisions.txt | while read line; do svnadmin dump /svn/old_repo -r$line >> ./docs_revisions.dump ; done

#You don't have to filter if you commited only files in your directory docs in your exported revisions
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./docs_revisions.dump > ./docs_only.dump

svnadmin load /svn/new_repos < ./docs_only.dump

Você deve substituir o URL do repo (URL_to_docs/svn/old_repo repositório ( path/to/docs) , o local no servidor ( ) e o caminho para os documentos no repositório ( )

Você pode editar facilmente o seu docs_only.dumpse quiser alterar o local do seu diretório doc em seu novo repositório.

Renato
fonte