svn: substitui o tronco pelo ramo


155

Qual é a melhor maneira de tornar uma das ramificações de um repositório do subversion o novo tronco?

Houve uma grande reescrita para todo o sistema: as coisas foram movidas, reescritas, substituídas, removidas, renomeadas etc. O código reescrito foi testado e está pronto para substituir o tronco antigo.

Basicamente, a linha principal antiga (Trunk 5) é marcada e termina aqui. A ramificação reescrita (Filial 6) deve se tornar a nova linha principal (Tronco 7):

Tronco (1) -> Tronco (2) -> Tronco (5) -> × + -> novo Tronco (7)
  \ \ |
  fork merge ???
    \ \ |
     + -> Filial (3) -> Filial (4) -> Filial (6) - +

Todas as alterações em andamento do antigo 'tronco' já estão incorporadas no 'ramo reescrito'

Como posso fazer isso?

Respostas:


118

Use svn move para mover o conteúdo do tronco antigo para outro lugar e renomeie o ramo para tronco posteriormente.

Note que copiar e mover svn funcionam como operações de arquivo. Você pode usá-los para mover / copiar coisas no seu repositório e essas alterações também são versionadas. Pense em "mover" como "copiar + excluir".

[EDIT] A Nilbus acabou de me notificar que você terá conflitos de mesclagem quando usar svn move.

Eu ainda acho que essa é a abordagem correta. Isso causará conflitos, mas se você mesclar cuidadosamente, é provável que não perca nenhum dado. Se isso lhe incomoda, use um VCS melhor como Mercurial ou Git .


1
Se você fizer isso, qualquer pessoa com alterações em uma cópia de trabalho no tronco original terá um conflito, mesmo que suas alterações sejam mescladas. Isso ocorre porque os arquivos são excluídos e adicionados novamente - eles são tratados como objetos separados com histórico separado.
Edward Anderson

@ nilbus: Você tentou? IIRC, SVN mostra que os arquivos foram excluídos e lidos, mas internamente, ele saberá que os arquivos foram movidos.
Aaron Digulla

Sim. Eu verifiquei duas cópias. Na primeira cópia, mudei o diretório A para A2 e o diretório B para A. Em seguida, movi A para B e depois A2 para A. (renomeie e renomeie de volta.) No segundo check-out, fiz uma alteração em um arquivo e tentei svn atualizar. Ele entrou em conflito porque o arquivo que eu alterei "foi excluído". Internamente, ele não salva cópias duplicadas dos arquivos, mas a exclusão que você vê realmente afeta você quando se trata de conflitos.
Edward Anderson

12
@ nilbus: Nesse momento, eu gostaria de citar Linus Torvalds: "O slogan do Subversion por um tempo foi" CVS feito da maneira certa ", ou algo assim, e se você começar com esse tipo de slogan, não há lugar para onde você pode Não há como fazer o CVS corretamente. "
Aaron Digulla

3
Sim. Eu concordaria. Para resolver esse problema, verifiquei o repositório com o svn-git e usei o git para rebase do ramo no master.
Edward Anderson

66

Concordo em usar o comando svn move para atingir esse objetivo.

Eu sei que outras pessoas aqui acham isso incomum, mas eu gosto de fazer dessa maneira. Quando tenho uma ramificação de recurso e estou pronto para mesclá-la com um tronco que também foi significativamente modificado, mesclarei-a em uma nova ramificação, geralmente denominada <FeatureBranchName>-Merged. Depois resolvo conflitos e testo o código mesclado. Depois de concluído, movo o tronco para a pasta de tags, para não perder nada. Por fim, mudo o meu <FeatureBranchName>-Mergedpara o porta-malas.

Além disso, eu prefiro evitar a cópia de trabalho ao fazer os movimentos, aqui estão alguns exemplos dos comandos:

svn move https://SVNUrl/svn/Repo/trunk https://SVNUrl/svn/Repo/tags/AnyName

svn move https://SVNUrl/svn/Repo/branches/BranchName-Merged https://SVNUrl/svn/Repo/trunk

Nota: eu uso 1.5


1
Essa pode não ser a melhor prática, mas certamente é a mais eficiente quando você tem um tronco muito antigo e todos trabalhavam em um galho como se fosse o tronco. Resolveu o meu problema!
Alex Perrin

12

Eu estava apenas olhando para esse problema recentemente, e a solução com a qual eu estava muito feliz estava executando

svn merge --ignore-ancestry tronco-url ramo-url

na cópia de trabalho do meu porta-malas.

Isso não tenta aplicar alterações de maneira histórica (mantendo alterações no tronco). Simplesmente "aplica a diferença" entre o tronco e o ramo. Isso não criará conflitos para seus usuários nos arquivos que não foram modificados. No entanto, você perderá suas informações históricas da ramificação, mas isso acontece quando você realiza uma mesclagem de qualquer maneira.


1
Após o svn 1.5, você poderá fazer fusões que preservam a história.
NSherwin

9

Recomendamos que você faça essas alterações através da ferramenta de navegador do repositório.

Tentar grandes operações de exclusão + movimentação através da cópia de trabalho é uma ótima maneira de eliminar a cópia de trabalho. Se você for forçado a usar a cópia de trabalho, execute confirmações incrementais após cada operação de exclusão ou movimentação e ATUALIZE sua cópia de trabalho após cada confirmação.


Um link para Repo seria útil (apenas para Conveniência salvar uma pesquisa google :))
Brian M. Caça

3
Desculpe. A ortografia fez parecer que eu estava me referindo a uma ferramenta específica (editada). Na verdade, a maioria das ferramentas da GUI SVN deve ter um recurso de navegador de repositório. FYI: Eu uso tartaruga tortoisesvn.tigris.org
Chris Nava

4

Se você deseja tornar o ramo o novo tronco (ou seja, se livrar de todas as alterações feitas no tronco desde que o ramo foi criado, você pode) 1. Criar um ramo do tronco (para fins de backup) 2. "reverter alterações "no tronco (selecione todas as revisões depois que a ramificação foi criada) 3. Mesclar a ramificação de volta ao tronco.

A história deve permanecer assim.

Atenciosamente, Roger


3

As soluções @Aaron Digulla e @kementeus são viáveis. Para repositórios do Subversion 1.4, operações de copiar / mover podem dificultar a migração futura para uma estrutura de repositório diferente ou dividir os repositórios.

Acredito que as melhorias do 1.5 incluem melhor resolução do histórico de movimentação / cópia, portanto, provavelmente não seria um problema para um repositório 1.5.

Para um repositório 1.4, eu recomendo usar svnadmin dumpe svndumpfilterexecutar o movimento do tronco existente em outro lugar, movendo o ramo para o tronco com o mesmo mecanismo. Carregue os dois arquivos de despejo em um repositório de teste, verifique e mova-o para produção.

Obviamente, faça backup do seu repositório existente antes de iniciar.

Isso preserva o histórico sem registrar explicitamente a movimentação / cópia e facilita a reorganização futura, preservando o histórico.


Editar: conforme solicitado, a documentação do comportamento 1.4, do livro 1.4 Red-Bean, Filtering Repository History

Além disso, os caminhos copiados podem causar alguns problemas. O Subversion suporta operações de cópia no repositório, onde um novo caminho é criado copiando algum caminho já existente. É possível que, em algum momento da vida útil do seu repositório, você possa ter copiado um arquivo ou diretório de um local que svndumpfilterestá excluindo, para um local que está incluindo. Para tornar os dados de despejo auto-suficientes,svndumpfilterainda precisa mostrar a adição do novo caminho - incluindo o conteúdo de qualquer arquivo criado pela cópia - e não representar essa adição como uma cópia de uma fonte que não existirá no seu fluxo de dados de despejo filtrado. Mas como o formato de despejo de repositório do Subversion mostra apenas o que foi alterado em cada revisão, o conteúdo da fonte de cópia pode não estar prontamente disponível. Se você suspeitar que possui cópias desse tipo em seu repositório, convém repensar seu conjunto de caminhos incluídos / excluídos, talvez incluindo os que também serviram como fontes de suas operações problemáticas de cópia.

Isso se aplica a migrações / reorganizações usando svndumpfilter. Há momentos em que um pouco de trabalho extra agora pode economizar muito trabalho mais tarde e, mantendo um uso fácil do svndumpfilterdisponível para futuras migrações / reorganizações, reduz o risco a um custo relativamente baixo.


Por que "svn move" não é suficiente? Sua sugestão parece esmagar uma mosca com uma marreta.
Rob Williams

Fui mordido por esse comportamento 1.4 - se um repositório SVN contiver movimentos (renomeações) de diretórios ou ramificações / tags, o uso do svndumpfilter para ajudar a reorganizar / migrar um repositório para uma nova estrutura pode falhar porque não lida com o histórico bem. Está documentado, vou desenterrar o juiz. se você gosta
Ken Gentil

Você poderia adicionar a referência a esse comportamento?
1100 Jacco

2

Embora as respostas acima funcionem, elas não são práticas recomendadas. A mais recente faixa de servidor e cliente svn é mesclada para você. Então, o svn sabe quais revisões você fundiu em um ramo e de onde. Isso ajuda muito ao manter uma filial atualizada e depois mesclá-la novamente ao tronco.

Não importa qual versão do Subversion você esteja usando, existe um método de práticas recomendadas para obter alterações em uma ramificação de volta ao tronco. Ele está descrito no manual do Subversion: Controle de Versão com o Subversion, Capítulo 4. Ramificação e Mesclagem, Mantendo uma Ramificação em Sincronização .


Obrigado pela informação oficial, para que eu possa mesclar ramo ao tronco pela agência oficial. A palavra-chave é reintegrada
Junyo 18/04/19

-3

É uma configuração realmente estranha / incomum no SVN, mesmo que eu esteja longe de ser uma "boa prática", de qualquer forma, acho que você poderia fazer algo como:

  • Fazer check-out de toda a fonte (svn co therootsourcetree)
  • Remova o tronco (svn rm trunk)
  • Copie a ramificação para o tronco (svn cp branches / thebranch / trunk)
  • Remova o ramo (svn rm branches / thebranch)
  • Confirme as alterações

Boa sorte


9
Isso destrói a trilha da história que seria preservada pelo "svn move".
Rob Williams
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.