Como mudar o UUID da cópia de trabalho do subversion?


13

Atualizei recentemente os repositórios do Subversion de uma versão 1.2.3 antiga para a 1.6.0 via svnadmin dump / load . Todos os repositórios antigos usavam o mesmo UUID (os repositórios foram criados usando-se a cópia de um repositório de modelos). Mudei o UUID em alguns dos novos repositórios via svnadmin setuuid para ser único. Não posso apenas realocar minhas cópias de trabalho existentes desses repositórios porque os UUIDs são diferentes. Eu sei sobre a exportação da cópia de trabalho e o check-out do novo repositório, mas fiquei pensando se havia uma maneira de alterar apenas o UUID da cópia de trabalho no local, como o que o svnadmin setuuid faz pelos repositórios.

Respostas:


3

Você precisa editar todos os arquivos de 'entradas' no seu repositório puxado. Se o repositório tiver muitos diretórios, localize + um script sed fará pouco trabalho com a tarefa.


17

Nova resposta desde o formato de cópia de trabalho do Subversion 1.7 . Você precisa do sqlite3utilitário de linha de comando.

No diretório raiz da sua cópia de trabalho, agora existe uma única .svn/pasta com um banco de dados SQLite. Você pode consultar o repositório atual UUIDconhecido por sua cópia de trabalho com:

$ sqlite3 .svn/wc.db 'select uuid from REPOSITORY where id=1'
b6dc3e6c-5320-4549-b231-c153d86d7525

Como resultado, a alteração UUIDpode ser feita com:

$ sqlite3 .svn/wc.db 'update REPOSITORY set uuid="1c0d1ec1-2326-0410-bef5-eb29cddfc032" where id=1'

Obviamente, mantenha um backup do .svn/wc.dbarquivo antes de chamar a consulta de atualização. Quase não há chance de sua entidade de repositório ter um ID diferente ou de haver várias linhas nessa tabela, mas você pode verificar se obtém resultados inesperados.


+1 funcionou perfeitamente com um repo realocado que também mudou UUID
Amro

8

Aqui está um comando que faz o truque para o SVN 1.6 e abaixo:

find . -type f -name entries -exec sed -i 's/old-uuid/new-uuid/g' {} \;

Substitua old-uuide new-uuidpelos IDs reais.


1
+ 1Obrigado pela solução. Isso não está funcionando para diretórios com espaços. "find. -type f -name entradas -exec sed -i 's / old-uuid / new-uuid / g' {} \;" sem aspas duplas parece funcionar.
Tommy

sry por necroing esta discussão este método me salvou um monte de tempo .. para outros tentando isso, só quero adicionar uma nota. Sed em MACOX parece precisar de um uso um pouco diferente, u necessidade de dizer sed -i "" 's/old-uuid/new-uuid/' e ele funciona (apenas as aspas duplas vazias extras) ( ref )
Karthik T

2

A resposta de Yves Martin funcionou muito bem para nós em várias cópias de trabalho com o SVN 1.8, mas acabamos encontrando casos em que não funcionava.

A execução do comando Yves sem "where id = 1" funcionou em todos os casos para nós:

$ sqlite3 .svn/wc.db 'update REPOSITORY set uuid="1c0d1ec1-2326-0410-bef5-eb29cddfc032"'

Investigando por que isso aconteceu, descobri que vários UUIDs são armazenados ao realocar o repositório, ao contrário da intuição de Yves de que isso nunca deveria acontecer.

Uma nova entrada na tabela REPOSITORY é adicionada após uma realocação em vez de atualizar a existente, armazenando um ID incrementado com a nova raiz do repositório e seu UUID. Portanto, os casos que falharam em funcionar corretamente foram as cópias de trabalho que já haviam sido realocadas no passado: O comando parecia funcionar, mas apenas o UUID inicial foi alterado, e não o atualmente sendo usado.

Pode-se verificar a lista de raízes e UUIDs armazenados em uma cópia de trabalho com este comando:

$ sqlite3 .svn/wc.db 'select id,uuid,root from REPOSITORY'

Finalmente, observarei que tive que usar um conjunto diferente de cotações para os arquivos de lote / linha de comando do Windows, da seguinte maneira:

> sqlite3.exe .svn\wc.db "update REPOSITORY set uuid='1c0d1ec1-2326-0410-bef5-eb29cddfc032'"

Obrigado por detalhes quando uma cópia de trabalho foi transferido, eu não estava ciente deste comportamento
Yves Martin

1

A seção " Gerenciando UUIDs de repositório " no svn red-bean book pode ter a resposta que você está procurando.


Essa seção fala sobre os UUIDs do repositório, não os UUIDs da cópia de trabalho.
Ioan

@Ioan: Citando essa seção: Para pessoas que usam versões do Subversion anteriores à 1.5, essas tarefas são um pouco mais complicadas. Você pode definir explicitamente o UUID de um repositório canalizando um stub de arquivo de despejo de repositório que carrega a nova especificação de UUID por meio do svnadmin load --force-uuid REPOS-PATH - Não é isso que você precisa?
yasouser

1
Novamente, não, não estou falando de UUIDs de repositório , mas de UUIDs de cópia de trabalho ; as cópias de trabalho são iguais a um checkout.
Ioan

Você não pode alterar o UUID da cópia de trabalho para o repositório do servidor sem atualizar ou svn alternar a cópia de trabalho para o local [novo / existente] do repositório.
yasouser 7/01/11
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.