Pergunta

Aqui temos tiver um repositório SVN com um tronco e um ramo para o desenvolvimento de uma nova versão.

O ramo está quase pronto para ser lançado agora, então eu decidi reintegrar o ramo de volta ao tronco. Obviamente, houve alguns conflitos. Incluindo um monte de conflitos de árvore de arquivos que foram apagados no tronco.

I resolvido todos os conflitos feliz o suficiente e cometeu o tronco.

O problema é que, em seguida, fez uma mais pequenas algumas mudanças para o ramo, então eu fui para reintegrar o ramo novamente e todos os mesmos conflitos de árvore ocorreu. Resolvê-los não é um problema, mas há muito e isso leva um tempo para verificar e resolver todos eles manualmente e eu não quero ter que passar pela mesma resolução processa cada vez que eu fazer uma mudança e de reintegração. Eu esperava SVN reconhecer que o ramo já havia sido reintegrado uma vez e apenas fundir a partir do ponto da última reintegração tinha ocorrido.

Quando eu abrir o gráfico de revisões, mostra o tronco eo ponto em que o ramo foi separada, mas ele não mostra a mesclagem. Deveria?

Servidor: WinServer2003 (R2sp2), VisualSVNServer (1.7.2). Cliente:. WindowsXP (SP3), eu estive usando TortoiseSVN (1.6.5) para fazer tudo isso, mas eu também tenho o cliente de linha de comando instalado

Eu faço a fusão por ter certeza que eu tenho o tronco até à data, e usando TortoiseSVN fazer uma mesclagem, e eu selecionar "Reintegração um ramo" quando apresentado com o diálogo de opção. I definir a profundidade de mesclagem para "cópia de trabalho"

Am I lidar com este cenário de forma incorreta? Devo estar fazendo algo diferente?

(Talvez nós temos o nosso errado layout de repositório. Nós ramificada a partir do tronco, fez todas as mudanças para a nova versão no ramo, agora o lançamento é devido estamos mesclando o ramo de volta ao tronco. Talvez este seja o abordagem errada, que eu li sobre algumas pessoas fazendo isso o contrário, fazer todas as mudanças no tronco, e fazer o ramo apenas quando você está quase pronto para o lançamento eo ramo se torna a versão suportada)

Foi útil?

Solução

O seguinte é a partir do final de neste capítulo do livro SVN:

No Subversion 1.5, uma vez que um merge --reintegrate é feito de galho em tronco, o ramo não é mais utilizável para os trabalhos futuros. Não é capaz de absorver corretamente novas alterações do tronco, nem pode ser adequadamente reintegrados ao tronco novamente. Por esta razão, se você quiser continuar trabalhando em seu ramo de funcionalidade, recomendamos destruí-lo e, em seguida, está criando-lo a partir do tronco

Outras dicas

Nesta situação eu não iria fundir código da ramificação para o tronco até depois de ter concluído o desenvolvimento.

I se merge de tronco em galho para garantir o seu ramo está atualizado com as correções aplicadas ao tronco. Realizar esta atividade periodicamente para garantir o seu ramo dev contém todas as correções. Então, no ponto em que o desenvolvimento se torna o lançamento ao vivo fazer o merge de galho em tronco como um fora de atividade.

A minha resposta faz algumas suposições, incluindo:

  • Você tem tronco ao vivo e dev ramos
  • Você tem apenas uma ao vivo versão (ou seja, não manter o legado versões)

Espero que ajude.

Agora, é realmente possível fazer repetido fusão bi-direcional

Uma palavra de cautela. Esta resposta explica como isso é feito para ser feito, mas se você perder qualquer passo que você vai se arrepender. Por exemplo, a fusão --reintegrate deve ser completamente trivial (todas as diferenças já resolvidas no branch) desde então você vai silenciosamente falta recebendo as mudanças que você fez no passo merge --reintegrate quando você continuar a trabalhar no ramo. A alternativa é excluir vez e recriar o ramo cada vez após --reintegrate.


Em pelo menos svn versão 1.6 e mais tarde você pode se repetido fusão bi-direcional. Você pode mesclar a partir do ramo 'main' para o ramo criança como muitas vezes quiser com apenas svn merge, mas cada vez que você mesclar a volta galho em principal, você tem que dar a opção

--reintegrate como mencionado em outras respostas.

O que você também tem que fazer é dizer ao seu ramo que você integrou em uma segunda etapa manual (com esse ramo verificado e atualizado) com o comando

svn merge --record-only -c 391 ^/calc/trunk

391 aqui representa a fusão cometer número do ramo --reintegrate cometer você fez no calc / trunk.

Se você perdê-lo, ele ainda pode funcionar, ou você pode precisar de conflitos de mesclagem re-resolve você já resolvidos próxima vez que você se fundem. Após a etapa somente recorde seus ramos estão prontos para o trabalho futuro ou fusão. É bobagem (especialmente se você está estragado por Git como eu, onde as coisas apenas trabalho), mas se você fazê-lo de acordo com este ritual funciona, e ambos os ramos estão sempre abertas para novos commits.


A coisa toda está documentado no livro SVN sob reintegração duas vezes

Esta fusão usa a sintaxe merge-cherry picking, que foi introduzida na seção chamada “Cherrypicking”. Continuando com o funcionamento exemplo da seção chamada “A reintegração de um ramo”, onde revisão X foi a revisão 391:

$ cd my-calc-branch $ svn update Updating '.': Updated to revision
393. $ svn merge --record-only -c 391 ^/calc/trunk
--- Recording mergeinfo for merge of r391 into '.':  U   . $ svn commit -m "Block revision 391 from being merged into my-calc-branch."
 Sending        .

 Committed revision 394.

Agora, o seu ramo está pronto para absorver as alterações do tronco novamente. Depois de outra sincronização de sua ramificação para o tronco, você pode até reintegrar o ramo de uma segunda vez. Se necessário, você pode fazer outra fusão só de registro para manter o ramo vivo. Enxágüe e repita.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top