Manuals

Integrar

Quando ramos são utilizados para manter linhas de desenvolvimento separadas, em alguma altura tu quererás integrar as alterações, que efectuaste num ramo, de volta para o trunk, ou vice-versa.

It is important to understand how branching and merging works in Subversion before you start using it, as it can become quite complex. It is highly recommended that you read the chapter Branching and Merging in the Subversion book, which gives a full description and many examples of how it is used.

O próximo ponto a anotar é que integrar processa-se sempre na tua cópia de trabalho. Se queres integrar alterações num ramo, tens de ter uma cópia de trabalho nesse ramo e invocar o assistente de integração a partir dessa cópa de trabalho, usando TortoiseSVNIntegrar....

De modo geral é uma boa ideia executar uma integração numa cópia de trabalho não modificada. Se tens outras alterações na tua CT, submete-as primeiro. Se a integração não correr como esperavas, poderás ter de reverte-la, e o comando Reverter irá descartar todas as alterações incluindo qualquer uma que tenhas feito antes da integração.

Existem três casos de utilização comuns para integrar, que são lidados de maneira ligeiramente diferente, como descrito abaixo. A primeira página do assistente de integração questiona-te a selecciona o método que precisas.

Integrar um intervalo de revisões

Este método cobre o caso em que criaste uma ou mais revisões num ramo ( ou no trunk) e queres portar essas alterações para um ramo diferente.

What you are asking Subversion to do is this: Calculate the changes necessary to get [FROM] revision 1 of branch A [TO] revision 7 of branch A, and apply those changes to my working copy (of trunk or branch B).

If you leave the revision range empty, Subversion uses the merge-tracking features to calculate the correct revision range to use. This is known as a reintegrate or automatic merge.

Integrar duas árvores diferentes

This is a more general case of the reintegrate method. What you are asking Subversion to do is: Calculate the changes necessary to get [FROM] the head revision of the trunk [TO] the head revision of the branch, and apply those changes to my working copy (of the trunk). The net result is that trunk now looks exactly like the branch.

If your server/repository does not support merge-tracking then this is the only way to merge a branch back to trunk. Another use case occurs when you are using vendor branches and you need to merge the changes following a new vendor drop into your trunk code. For more information read the chapter on vendor branches in the Subversion Book.

A Integrar Um Intervalo de Revisões

Figura 4.53. O Assistente de Integração - Seleciona o Intervalo de Revisões

O Assistente de Integração - Seleciona o Intervalo de Revisões


No campo De: introduz o URL completo da pasta, do ramo ou etiqueta que contêm as alterações que queres portar para a tua cópia de trabalho. Podes também clicar ... para navegar no repositório e encontrar o ramo desejado. Se já integraste anteriormente deste ramo, usa apenas a lista drop down que mostra o histórico dos URLs previamente utilizados.

If you are merging from a renamed or deleted branch then you will have to go back to a revision where that branch still existed. In this case you will also need to specify that revision as a peg revision in the range of revisions being merged (see below), otherwise the merge will fail when it can't find that path at HEAD.

No campo Intervalo de revisões a integrar introduz a lista de revisões que desejas integrar. poderá ser uma única revisão, uma lista de revisões específicas separadas por virgulas, ou um intervalo de revisões separadas por um hífen, ou uma qualquer combinação destes.

Se precisas de especificar uma revisão cavilha para a integração, adiciona a revisão cavilha no fim das revisões, e.g. 5-7,10@3. No exemplo acima, as revisões 5,6,7 e 10 seriam integradas, sendo a 3 a revisão cavilha.

Importante

Existe uma diferença importante na maneira como o intervalo de revisões é especificado no TortoiseSVN, comparado com o cliente de linha de comando. A maneira mais fácil para o visualizar é pensar numa vedação com postes e painéis de vedação.

Com o cliente de linha de comando, tu especificas as alterações a integrar usando duas revisões postes de vedação, que especificam os pontos antes e depois.

Com o TortoiseSVN tu especificas uma lista-de-alterações para integrar utilizando paineis de vedação. A razão para isto torna-se clara quando usas a caixa de diálogo de registo para especificar as revisões a integrar, onde cada revisão aparece como uma lista-de-alterações.

Se estiveres a integrar revisões em bloco, o método mostrado no livro do Subversion integra-te a 100-200 desta vez e 200-300 da próxima. Com o TortoiseSVN integra-te a 100-200 desta vez e 201-300 da próxima.

Esta diferença gerou muita discussão acalorada nas listas de correio. Nós reconhecemos que existe uma diferença para o cliente da linha de comandos, mas cremos que para a maioria dos utilizadores do GUI é mais fácil de compreender o método que implementámos.

A maneira mais fácil para seleccionar o intervalo de revisões que precisas é clicar no Mostrar registo, já que este irá listar as alterações mais recentes com os teus comentários de registo. Se queres integrar as alterações a partir de uma única revisão, selecciona apenas essa revisão. Se queres integrar as alterações de várias revisões então, selecciona esse intervalo (usando o modificador usual Shift). Clica no OK e o números da lista de revisões a integrar serão preenchidas por ti.

Se queres remover alterações integradas, da tua cópia de trabalho, para reverter uma alteração que já foi submetida, selecciona as revisões a reverter e tem a certeza que a caixa de verificação Reverter integração está verificada.

Se já integraste algumas alterações deste ramo, espera-se que tenhas introduzido, uma nota da última revisão integrada, na mensagem de registo quando submeteste a alteração. Nesse caso podes usar o Mostrar Registo na cópia de trabalho para seguir essa mensagem de registo. Relembrando que estamos a pensar nas revisões como listas-de-alterações, deverás usar a revisão depois do ponto de chegada da última integração, como ponto de partida para esta integração. Por exemplo, se integraste as revisões de 37 a 39 da última vez, então o ponto de partida para esta integração deverá ser a revisão 40.

Se estás a usar as funcionalidades de rastreamento de integração, do Subversion, não precisas de te lembrares quais as revisões que já foram integradas - o Subversion irá recordar-se disso por ti. Se deixas o intervalo de revisões em branco, todas as revisões que não foram ainda integradas serão incluídas. Consulta “Rastreamento de Integração” para saberes mais.

Quando o seguimento de integração é usado, a caixa de diálogo de registo irá mostrar as revisões previamente integradas e as revisões antecedentes ao ponto do antecessor comum, i.e. antes do ramo ser copiado, a cinzento. A caixa de verificação Ocultar revisões não.integráveis permite-te filtrar completamente essas revisões, para que vejas apenas as revisões que podem ser integradas.

Se podem estar outras pessoas a submeter alterações então tem cuidado no uso da revisão HEAD. Poderá não se referir à revisão que estás a pensar se alguém efectuou uma submissão após a tua última actualização.

If you leave the range of revisions empty or have the radio button all revisions checked, then Subversion merges all not-yet merged revisions. This is known as a reintegrate or automatic merge.

Existem algumas condições que se aplicam a uma integração de reintegração. Primeiramente, o servidor deverá suportar o rastreamento de integração. A cópia de trabalho deverá ser de nível infinito (sem checkouts dispersos), e não deverá ter nenhumas alterações, itens trocados ou itens que foram actualizadas para revisões diferentes da HEAD. Todas as alterações para o trunk feitas durante o desenvolvimento do ramo, deverão ter sido já integradas transversalmente para o ramo (ou marcadas como tendo sido feitas). O intervalo de revisões a integrar será então calculado automaticamente.

Clica Seguinte e segue para “Opções de Integração”.

A Integrar Duas Árvores Diferentes

Figura 4.54. O Assistente de Integração - Integração de Árvores

O Assistente de Integração - Integração de Árvores


Se estás a usar este método para integrar um ramo de funcionalidade de volta para o trunk, necessitas de arrancar o assistente de integração de dentro da cópia de trabalho do trunk.

No campo De: introduz o URL completo da pasta trunk. Isto pode soar errado, mas lembra-te que o trunk é o ponto de partida para o qual queres adicionar as alterações do ramo. Podes também clicar ... para navegar o repositório.

No campo Para: introduz o URL completo da pasta do ramo de desenvolvimento.

Em ambos os campos Da Revisão e Para Revisão, introduz o número da última revisão em que as duas árvores estiveram sincronizadas. Se tens a certeza que ninguém está a fazer submissões, podes usar a revisão HEAD em ambos os casos. Se existe uma hipotese de alguém ter feito uma submissão desde essa sincronização, deves usar números de revisões específicas para evitar perder submissões mais recentes.

Podes também usar o Mostrar Registo para seleccionar a revisão.

Opções de Integração

Esta página do assistente deixa-te especificar opções avançadas antes de começar o processo de integração. Na maior parte do tempo tu podes apenas usar as opções por defeito.

Tu podes especificar o nível a usar na integração, i.e. até que ponto deverá a integração penetrar na tua cópia de trabalho. Os termos do nível usados estão descritos em “Profundidade do Checkout”. O nível por defeito é a Cópia de trabalho, e é quase sempre o que precisas.

Most of the time you want merge to take account of the file's history, so that changes relative to a common ancestor are merged. Sometimes you may need to merge files which are perhaps related, but not in your repository. For example you may have imported versions 1 and 2 of a third party library into two separate directories. Although they are logically related, Subversion has no knowledge of this because it only sees the tarballs you imported. If you attempt to merge the difference between these two trees you would see a complete removal followed by a complete add. To make Subversion use only path-based differences rather than history-based differences, check the Ignore ancestry box. Read more about this topic in the Subversion book, Noticing or Ignoring Ancestry.

Tu podes especificar a forma como os fins-de-linha e espaços-em-branco são lidados. Essas opções são descritas em “Opções de Fim-de-Linha e Espaços-Brancos”. O comportamento por defeito é tratar todos os espaços-em-branco e os fins-de-linha como alterações a serem integradas.

A caixa de verificação Force the merge é usada para evitar um conflito de árvore quando um remover afectar um ficheiro que foi modificado localmente ou não está versionado. Se o ficheiro foi removido então não há maneira de o recuperar, sendo por isso que essa opção não está marcada por defeito.

Se estás a usar o rastreamento de integração, e queres marcar a revisão como tendo sido integrada, sem actualmente efectuar essa integração aqui, verifica a caixa de verificação Só regista a integração. Existem duas razões possíveis para que tu queiras fazer isto. Poderá ser que a integração seja muito complicada para os algoritmos de integração, pelo que inseres as alterações manualmente, e então marcas como integrada, para que o rastreador de integração conheça esse facto. Ou queiras evitar que uma revisão particular seja integrada. Considerando-a como já integrada, irá evitar que a integração ocorra com clientes sensíveis ao seguimento.

Agora tudo está configurado, tudo o que tens de fazer é clicar no botão Integrar. Se queres pré-visualizar os resultados o Testar Integração simula a operação de integração, mas não modifica de todo a cópia de trabalho. Mostra-te uma lista de ficheiros que serão alterados por uma integração real, e anota os ficheiros onde os conflitos podem ocorrer. Porque o rastreador de integração torna o processo de integração muito mais complexo, não existe maneira garantida de determinar em avanço se uma integração irá ser concluída sem conflitos, pelo que os ficheiros marcados como em conflito numa integração de teste, poderão de facto integrar-se sem qualquer problema.

The merge progress dialog shows each stage of the merge, with the revision ranges involved. This may indicate one more revision than you were expecting. For example if you asked to merge revision 123 the progress dialog will report Merging revisions 122 through 123 . To understand this you need to remember that Merge is closely related to Diff. The merge process works by generating a list of differences between two points in the repository, and applying those differences to your working copy. The progress dialog is simply showing the start and end points for the diff.

Rever os Resultados de Integração

A integração está agora completa. É uma boa ideia dar uma vista de olhos na integração e ver se está como o esperado. Integrar é normalmente algo complicado. Os conflitos surgem com frequência se o ramo divergiu bastante do trunk.

Dica

Quando são integradas as revisões na cópia de trabalho, o TortoiseSVN gera uma mensagem de registo para todas as revisões integradas. Essas ficam então disponíveis a partir do botão Mensagens recentes na janela de diálogo submeter.

Para personalizar essa mensagem gerada, coloca as respectivas propriedades de projecto na tua cópia de trabalho. Consultar “Templates de mensagens de registo”

Para clientes e servidores Subversion, anteriores à versão 1.5, nenhuma informação sobre integração é armazenada e as revisões tem de ser seguidas manualmente. Quando tiveres testado as alterações e fores então submeter esta revisão, a tua mensagem de registo deverá incluir sempre os números das revisões que foram portadas na integração. Se queres aplicar posteriormente outra integração, necessitarás de conhecer o que já integraste, já que não queres portar uma alteração mais do que uma vez. Para mais informação, consulta Best Practices for Merging no livro do Subversion.

Se o teu servidor e todos os clientes estão a correr o Subversion 1.5, ou versão superior, a funcionalidade de rastreamento de integração irá registar as revisões integradas e evitar que uma revisão seja integrada mais que uma vez. Isto torna a tua vida muito mais simples, já que podes simplesmente integrar o intervalo completo de revisões de cada vez, e saber que só as novas revisões serão realmente integradas.

A gestão de ramos é importante. Se queres manter este ramo actualizado com o trunk deverás ter o cuidado de integrar com frequência, para que o ramo e o trunk não divirjam muito. É claro que deverás evitar ainda a integração repetida de alterações, como descrito acima.

Dica

Se acabaste de integrar um ramo de funcionalidade de volta para o trunk, este agora contém todo o código da nova funcionalidade, tornando-se o ramo obsoleto. Podes então remove-lo do repositório, se for requerido.

Importante

O Subversion não pode integrar um ficheiro com uma pasta e vice-versa - só pastas com pastas e ficheiros com ficheiros. Se clicas num ficheiro e abres a caixa de diálogo de integração, então tens de dar o caminho para um ficheiro nessa caixa de diálogo. Se seleccionas uma pasta e abrires a caixa de diálogo, então terás de especificar um URL de uma pasta para a integração.

Rastreamento de Integração

O Subversion 1.5 introduz facilidades para rastreamento da integração. Quando tu integras alterações de uma árvore para outra, os números de revisões integradas são armazenadas e esta informação pode ser usada para vários propósitos diferentes.

  • Podes evitar o perigo de integrar a mesma revisão duas vezes (problema da integração repetida). De cada vez que uma revisão for marcada como tendo sido integrada, integrações futuras, que incluam essa revisão no seu intervalo, irão ignorá-la.

  • Quando integras um ramo de volta para o trunk, a caixa de diálogo de registo pode-te mostrar as submissões no ramo como parte do registo do trunk, dando-te melhor rastreamento das alterações.

  • Quando mostras a caixa de diálogo de registo de dentro da caixa de diálogo de integração, as revisões já integradas são mostradas a cinzento.

  • Quando mostrada a informação de responsabilidade para um ficheiro, podes então escolher mostrar o autor original das revisões integradas, em vez de, a pessoa que efectuou a integração.

  • Tu podes marcar revisões como não integrar incluindo-as na lista de revisões integradas sem realmente efectuar a integração.

A informação de rastreamento de integração é armazenada na propriedade svn:mergeinfo pelo cliente, quando executa uma integração. Quando a integração é submetida, o servidor armazena essa informação numa base de dados, e quando tu requisitas a informação de integração, registo ou responsabilidade, o servidor possa responder de acordo. Para o sistema funcionar correctamente deves assegurar que o servidor, repositório e todos os clientes estejam actualizados. Clientes antigos não irão armazenar a propriedade svn:mergeinfo e servidores antigos não irão fornecer essa mesma informação, requisitada pelos novos clientes.

Mais informações sobre o controlo de integração do Subversion em; Merge tracking documentation.

Handling Conflicts after Merge

Importante

The text in the conflict resolver dialogs are provided by the SVN library and might therefore not (yet) be translated as the TortoiseSVN dialogs are. Sorry for that.

Merging does not always go smoothly. Sometimes there is a conflict. TortoiseSVN helps you through this process by showing the merge conflict dialog.

Figura 4.55. The Merge Conflict Dialog

The Merge Conflict Dialog


It is likely that some of the changes will have merged smoothly, while other local changes conflict with changes already committed to the repository. All changes which can be merged are merged. The Merge Conflict dialog gives you different ways of handling the lines which are in conflict.

For normal conflicts that happen due to changes in the file content or its properties, the dialog shows buttons which allow you to chose which of the conflicting parts to keep or reject.

Postpone

Don't deal with the conflict now. Let the merge continue and resolve the conflicts after the merge is done.

Accept base

This leaves the file as it was, without neither the changes coming from the merge nor the changes you've made in your working copy.

Accept incoming

This discards all your local changes and uses the file as it arrives from the merge source.

Reject incoming

This discards all the changes from the merge source and leaves the file with your local edits.

Accept incoming for conflicts

This discards your local changes where they conflict with the changes from the merge source. But it leaves all your local changes which don't conflict.

Reject conflicts

This discards changes from the merge source which conflict with your local changes. But it keeps all changes that don't conflict with your local changes.

Mark as resolved

Marks the conflicts as resolved. This button is disabled until you use the button Edit to edit the conflict manually and save those changes back to the file. Once the changes are saved, the button becomes enabled.

Editar

Starts the merge editor so you can resolve the conflicts manually. Don't forget to save the file so the button Mark as resolved becomes enabled.

If there's a tree conflict, please first see “Conflitos de Árvore” about the various types of tree conflicts and how and why they can happen.

To resolve tree conflicts after a merge, a dialog is shown with various options on how to resolve the conflict:

Figura 4.56. The Merge Tree Conflict Dialog

The Merge Tree Conflict Dialog


Since there are various possible tree conflict situations, the dialog will show buttons to resolve those depending on the specific conflict. The button texts and labels explain what the option to resolve the conflict does. If you're not sure, either cancel the dialog or use the Postpone button to resolve the conflict later.

Manutenção do Ramo de Funcionalidade

Quando desenvolves uma nova funcionalidade num ramo separado, é uma boa ideia definir uma política para reintegração quando a funcionalidade estiver completa. Se outro trabalho está a decorrer no trunk ao mesmo tempo, poderás descobrir que as diferenças tornar-se-ão significativas ao longo do tempo, e integrar de volta pode-se tornar um pesadelo.

Se a funcionalidade é relativamente simples e o desenvolvimento não será muito longo, então poderás adoptar uma abordagem simples, que é manter o ramo inteiramente separado até a funcionalidade estar completa, então integras as alterações do ramo de volta para o trunk. No assistente de integração isto deverá ser um simples Integrar um intervalo de revisões, com o intervalo de revisões sendo o intervalo completo de revisões do ramo.

Se a funcionalidade irá demorar mais tempo e tu precisas de ter em conta todas as alterações no trunk, então tu necessitas de manter o ramo sincronizado. Isto significa simplesmente que periodicamente integras as alterações do trunk no ramo, para que o ramo contenha todas as alterações do trunk mais a nova funcionalidade. O processo de sincronização usa Integrar um intervalo de revisões. Quando a funcionalidade estiver completa, então podes integrá-la de volta para o trunk usando Reintegrar um ramo or Integrar duas árvores diferentes.

Another (fast) way to merge all changes from trunk to the feature branch is to use the TortoiseSVNMerge all... from the extended context menu (hold down the Shift key while you right click on the file).

Figura 4.57. The Merge-All Dialog

The Merge-All Dialog


This dialog is very easy. All you have to do is set the options for the merge, as described in “Opções de Integração”. The rest is done by TortoiseSVN automatically using merge tracking.

TortoiseSVN homepage