o carregamento do subversion falha com "nenhuma revisão"

18

Estou tentando aprender como migrar um repositório do Subversion e estou enfrentando um problema que não faz sentido para mim. Eu costumava svndumpfilterdividir um subprojeto e removi alguns prefixos de caminho. Agora, várias centenas de confirmações são importadas corretamente, mas estou recebendo o seguinte erro:

<<< Started new transaction, based on original revision 19190
     * editing path : branches/features/DynamicSource ... done.
     * editing path : branches/features/DynamicSource/src/build.properties ... done.
     * editing path : branches/features/DynamicSource/src/client/default.htm ...done.
     * editing path : branches/features/DynamicSource/src/client/js/AdHocController.js ... done.
     * editing path : branches/features/DynamicSource/src/client/js/Report.js ... done.
svnadmin: E160006: No such revision 19098
     * adding path : branches/features/DynamicSource/src/client/js/Enums.js ...

OK, então eu ir para o arquivo de despejo de olhar para revisões 19190 e 19098. Em primeiro lugar, a revisão 19098 faz existir no arquivo de despejo e foi importado sem nenhum problema. A revisão 19190 é uma mesclagem. Em 19190, aqui estão as informações do último arquivo, que parecem estar causando o problema:

Node-copyfrom-rev: 19100
Node-copyfrom-path: trunk/src/client/js/Enums.js
Text-copy-source-md5: 2db7f8d9c0ba4750d88ce0722731aad6
Node-path: branches/features/DynamicSource/src/client/js/Enums.js
Node-action: add
Text-copy-source-sha1: 8f930509f8dbc17c5e82cd40aa5a76454d3d812c
Node-kind: file
Content-length: 0

Confusamente, a revisão 19100 NÃO existe neste arquivo filtrado. Mas o erro não está se referindo a 19100, está se referindo a 19098!

O que faço para carregar esse arquivo?

Obrigado!

Harlan
fonte
Se algo complicado ("despejo e filtro" seguido de "importação") falhar, tente algo mais simples primeiro ("despejo" e depois "importar"). Eu apenas migrei um repositório inteiro, e isso foi fácil.
precisa saber é o seguinte
Obrigado Dirk. Nós realmente temos que dividir este repo, no entanto.
quer
Talvez faça "Dump, Import. Reduza manualmente, Dump novamente. Importe 2nd Dump". ?
precisa saber é o seguinte
A menos que esteja faltando alguma coisa, não acho que o SVN funcione dessa maneira. Você deve reduzir usando o arquivo de despejo e o svndumpfilter. E nós queremos manter a história, tanto quanto possível.
Harlan
3
Por que não migrar para git ou mercurial e livrar-se do SVN herdado na mesma etapa?
vonbrand

Respostas:

1

Eu já fiz esse tipo de divisão muitas vezes. Eu acho que tudo depende de como você usa o filtro e de qual processamento você faz no arquivo de despejo posteriormente. Pessoalmente, também tive que alterar o usuário svn, ao lado do caminho do projeto, e renumerar as revisões. Para que você possa ver o que pode ser feito, aqui está uma parte relevante do meu script.

grp=$cust_group
usr=$cust_customer
svndumpfilter include $grp/$usr --drop-empty-revs --renumber-revs  <$repo_dump > $repo_dump.$usr
sed -e "s/Node-path: $grp\/$usr/Node-path: /" <$repo_dump.$usr >$repo_dump.$usr.fixed1
sed -e "s/Node-copyfrom-path: $grp\/$usr/Node-copyfrom-path: /" <$repo_dump.$usr.fixed1 >$repo_dump.$usr.fixed2
sed -e "/Node-path: /{ N; N; N; N; N; N; s/Node-path: \nNode-action: add\nNode-kind: dir\nProp-content-length: 10\nContent-length: 10\n\nPROPS-END//}" <$repo_dump.$usr.fixed2 >$repo_dump.$usr.fixed3
sed -e "/svn:author/{ N; N; s/svn:author\n.*\n$svn_usr_from/svn:author\nV $svn_usr_len\n$svn_usr_to/}" <$repo_dump.$usr.fixed3 >$repo_dump.$usr.fixed4
svnadmin load $repo_dir/$cust_group/$cust_customer --ignore-uuid < $repo_dump.$usr.fixed4

chown svn:svn -R $repo_dir/$cust_group/$cust_customer
#chown apache $repo_dir/$cust_group/$cust_customer/db/txn-current
#chown apache $repo_dir/$cust_group/$cust_customer/db/current
# apache is in svn group so the above 2 are not needed
chmod -R g+rw $repo_dir/$cust_group/$cust_customer

O que acontece é que, primeiro, eu filtrei o que eu precisava, eliminei as revisões vazias por razões óbvias e as renumerei. Isso fornece boas revisões ordenadas. Depois, largo o caminho raiz do projeto, que no meu caso estava na forma de grupo / cliente, porque no novo repositório que não faz sentido (em vez disso, o repositório em si é grupo / cliente em disco) - este é o primeiro 2 sed's

A seguir, removo a importação de diretórios sem nome, um resultante dos 2 seds acima para o diretório do grupo e outro para a adição do diretório grupo / cliente.

finalmente, seduzi o autor para alterá-lo para um novo. Este também foi um pouco complicado, pois exigia a atualização do comprimento da definição da propriedade.

Então eu carrego e ajusto as permissões do sistema de arquivos. Observe os 2 chowns comentados para o apache, em alguns casos, você precisará dele. Acabei adicionando apache ao grupo svn.

Agora, eu nunca tive fusões nos meus repositórios SVN, então nunca tive que lidar com eles para a divisão. No seu caso, eu imaginaria que o que acontece é que o caminho da revisão de origem não é importado e é por isso que não o encontra, mesmo que o erro se queixe da própria revisão). A regra prática no arquivo de importação svn é que tudo o que é referido em um ponto já deve ter sido importado antes de ser referido. Portanto, você pode ter filtrado algo que não deveria, mesmo que queira, ou não atualizado o arquivo de despejo corretamente para refletir quaisquer outras alterações feitas.

Se você fornecer a estrutura relevante do seu repo original, incluindo o caminho da fonte mesclada, além de suas chamadas com parâmetros, talvez eu possa lhe dizer o que você perdeu. Meu dinheiro está na fonte da mesclagem.

julho
fonte
1

Eu usei uma ótima ferramenta svndumpsanitizer . O problema é que a estrutura do repositório do subversion é muito complicada. Quando svndumpfilter está na revisão 10, não há como saber se um nó que o usuário deseja descartar será movido para uma posição que deseja manter na revisão 113. Portanto, faz a única coisa que pode fazer - descarta o nó e, na revisão 113, os dados são descartados porque já descartaram os dados que seriam necessários.

O Svndumpsanitizer funciona de uma maneira diferente. Ele verifica os nós várias vezes para descobrir quais nós realmente devem ser mantidos. Depois de determinar quais nós manter, ele grava apenas esses nós no arquivo externo. Finalmente - se necessário - ele adiciona uma confirmação que exclui os nós indesejados que precisavam ser mantidos para não quebrar o repositório.

ALex_hha
fonte