No subversion como posso criar um repositório escravo a partir do mestre na revisão atual?

1

Eu tenho um enorme repositório subversion e quero criar um repositório escravo para fins de backup ao vivo.

No entanto, eu não quero repetir o histórico de revisão no escravo porque isso literalmente levará dias devido ao tamanho do meu repositório. Eu já tenho a infra-estrutura usual no local, como scripts de gancho e dois servidores web que atendem o mestre e o repositório logo a ser escravo.

Como faço isso?

    
por aseq 22.03.2012 / 09:12

2 respostas

2

O Subversion tem a capacidade de suportar um ou mais repositórios escravos que você pode sincronizar usando scripts de gancho ou você pode usar um cron job que executa o svnsync para você. Quando você cria um repositório escravo, o procedimento envolve, entre outras coisas, a criação de um repositório com apenas a revisão 0 e, em seguida, você repete todas as confirmações do mestre para esse escravo. Dependendo da sua largura de banda e do tamanho do repositório, isso pode levar muito tempo.

Existe uma maneira mais rápida de fazer isso. Isso envolve copiar o mestre atual para o novo local e, em seguida, executar alguns truques para transformá-lo em um escravo. Deixarei a implementação real da sincronização automática ou ao vivo até você.

Nesta resposta, supomos:

  • O nome do repositório é "repo"
  • O servidor mestre é acessível por meio do sistema de arquivos
  • O servidor slave está acessível no link

Eu usei esse método muitas vezes com um repositório de subversão de 20 GB, eu também recuperei com sucesso um mestre quebrado algumas vezes copiando um escravo, criado desta forma, de volta para o mestre.

Vamos copiar o mestre e transferi-lo para o servidor remoto, no diretório em que seu repositório reside:

svnadmin hotcopy repo repo_bak
tar -cjf repo_bak.tar.bz repo_bak
scp repo_bak.tar.bz [email protected]:/path/

O comando hotcopy permite copiar com segurança um repositório atualmente em uso e mantê-lo consistente.

Descompacte o tarball no servidor slave e tudo isso ...

Assumimos que no servidor slave você está executando um servidor da web configurado para servir o repositório da maneira usual. Além disso, ele precisa de scripts de ganchos que impeçam qualquer conta, exceto a conta de sincronização, por razões óbvias, queremos que os repositórios sejam exatamente os mesmos. Novamente, como fazer isso está fora do escopo desta resposta.

Executamos todos os comandos abaixo no repositório principal.

Vincule o repositório principal ao repositório escravo:

svn propset svn:sync-from-url --revprop -r 0 file:///example/path/repo https://slave.example.org/repo

Descubra a revisão do repositório escravo, isso também lhe dará o UUID que você precisará abaixo:

svn info https://slave.example.org/repo

Use a revisão que você encontrou acima no seguinte comando:

svn propset svn:sync-last-merged-rev --revprop -r 0 REVISION_OF_SLAVE https://slave.example.org/repo

Precisamos usar o UUID encontrado acima para adicionar ao repositório principal:

svn propset svn:sync-from-uuid --revprop -r 0 UUID_OF_SLAVE https://slave.example.com/repo

Se tudo correu bem, agora você pode sincronizar com sucesso o escravo:

svnsync sync https://slave.example.org/repo
    
por 22.03.2012 / 09:18
1

Os locais certos para ler sobre a execução da replicação do repositório do Subversion sobre o svnsync:

PS - você deve ter espelhamento completo do master-repo no slave, mas você pode tentar iniciar não a partir do repositório vazio, mas clonado sobre svnadmin dump em algum ponto ( não hotcopy! )

    
por 22.03.2012 / 10:56