Como migrar todos os URLs em svn: propriedades externals através de um repositório?
-
03-07-2019 - |
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?
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