Pergunta

Estamos no processo de mover nossos repositórios SVN de uma máquina para outra, e com ele virá um novo nome de domínio para o novo repo. O problema é que, dentro do repositório, há lotes de svn: externals referências a outros projetos dentro do repositório. Assim, por exemplo, temos Projecta, que tem no svn: propriedades externals:

external/libraryA svn://oldserver.net/repo/libraryA
external/libraryB svn://oldserver.net/repo/libraryB

... e assim por diante. Todos referência do URL este nome de domínio particular, para que possa ser facilmente analisado. Tendo já aprendi minha lição, eu vou migrar esses URLs para ser "svn: // localhost /", mas eu preciso encontrar uma maneira de percorrer o histórico do repositório e reescrever todos os URLs antigas, de modo que ainda pode conferir revisões mais antigas destes projectos sem ter links quebrados.

Como eu iria fazer isso?

Foi útil?

Solução

Como você indicou que ainda quero ser capaz de verificar revisões mais antigas, a única solução é realmente a "reescrever" toda a história (solução D mencionado anteriormente).

Para fazer isso, você deve:

1) Despejar o conteúdo do inteira repositório usando svnadmin despejo :

$ svnadmin dump /path/to/repos > original-dumpfile
* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.

2) Editar o arquivo de despejo, para alterar o svn: URLs externas. Esta é a parte mais difícil : Assumindo o repositório contém dados binários bem, abrindo o arquivo de despejo em um editor de texto simples provavelmente irá corromper o arquivo de despejo. Eu tive boas experiências usando o chamado "hex-editor", por exemplo, o freeware Hex editor XVI32

3) Criar um novo repositório e carregar o arquivo de despejo modificado para ele:

$ svnadmin create newrepos
$ svnadmin load newrepos < modified-dumpfile

Para obter mais informações, você pode também estar interessado neste link:
http://svnbook.red-bean.com/en/1.1/ch05s03.html

NOTA: Subversion 1,5 apoio realmente adicionados para URLs relativos na propriedade svn: externals, que pode evitar precisamente este tipo de problemas no futuro:
http://subversion.tigris.org/svn_1.5_releasenotes.html#externals

Outras dicas

Eu usaria SvnDumpTool para isso. Ele tem exatamente o que você está procurando:

svndumptool transform-prop svn:externals "(\S*) (|-r ?\d* ?)http://oldserver.net(/\S*)" "\2\3 \1" source.dumpfile source-fixed-externals.dumpfile

Isso corrige a cada externos ao subversão formato 1.5 e usa URLs relativos.

Assim svn: externos como:

external/libraryA svn://oldserver.net/repo/libraryA

tornar-se:

 /repo/libraryA external/libraryA

usando URLs relativos de raiz do servidor.

Eu tive que mudar 12 cópias de trabalho por 9 usuários e 4 implementações. Foi uma mudança simples, substituindo um domínio com um IP, ou seja, thing.domain.net -> 192.168.0.1

Esperando svn relocate a comportar-se como descrito (externos travessia aninhados) Eu escrevi um simples instrução DOS para executar em cada local:

for /D %G in (*) do ( cd ./%G & svn relocate http://thing.domain.net http://192.168.0.1 & cd ..)

Isto não funcionou como esperado, apenas a relocação do WC pai.

Minha solução foi editar os repositórios-se (eu usei Tortoise Repo Browser) para alterar a localização dos externos. Na sequência desta alteração uma atualização para o pai realocado foi tudo o que era necessário para colocar tudo em linha.

É provavelmente seria uma boa idéia para obter todos os usuários tartaruga para limpar seu histórico de URL para que eles não inadvertidamente executar operações usando o velho URL (que ainda existe na pesquisa de DNS):

Settings->Saved Data->URL history->Clear

Eu editei o meu arquivo de despejo com o vi, mas eu tive que usar a opção "-b" para editar em modo binário de tal forma que quaisquer caracteres que poderia ser interpretado como final de linha não se converteu.

por exemplo. vi -b filename.dump

Além disso, descobri que, se o URL de alterações de comprimento, há comprimentos de corda, que também teve que ser modificado. Por exemplo, considere uma entrada parecida com esta:

Node-path: trunk / src / include

Node-tipo: dir

Nó de ação: mudança

Prop-content-length: 192

Conteúdo-comprimento: 192

K13

svn: externals

V 156

MGL_ABC svn: // server_name / dir1 / dir2

MGL_DEF svn: // server_name / dir1 / pasta3

Quando você modificar esses URLs, se o comprimento das mudanças de cordas, é preciso também mudar o "192", "192" e "156" para coincidir com o novo comprimento. Eu achei difícil de calcular o comprimento absoluto, mas fácil de encontrar o diferencial.
Por exemplo, digamos que URL 1 torna-se mais curto por 3 caracteres e URL 2 torna-se mais curto por 4 caracteres. Então, você teria que subract '7' de cada um desses três números comprimento do fio.

Você pode:

a) verificar a antiga revisão, e mudar sua anfitriões-arquivo para apontar o nome antigo para o novo endereço, em seguida, svn update. No caso do URL-path também mudou ... bem, então você poderia muito bem:

b) ter o tempo para escrever um script que encontrar as propriedades do atual (revision- de idade) cópia de trabalho e altera os URLs lá, sem cometer-los. OR:

c) fazer uma nota da revisão (s) onde o check-in os novos valores de propriedade, consulte a versão antiga, e simplesmente fazer uma mesclagem essas revisões (-que afetam apenas as propriedades) em sua cópia de trabalho.

d) ou, possivelmente, o uso svndump para despejar os dados do repositório, corda-substituir a URL no despejo, em seguida, restaurá-lo .. Eu não lhe daria nenhuma garantia de que isso funciona mesmo; -)

Todos os meus externos estavam em diretórios nomeados flow. I corrigir os URLs em meus externos com este one-liner (shell bash):

for p in $(find -maxdepth 4 -name flow); do svn ps svn:externals "$(svn pg svn:externals $p/.. | perl -pe 's/^(\w+) svn\+ssh.*thing\.domain\.net(.*)/$2 $1/')" $p/..; done
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top