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