setembro 12, 2012

Criando e aplicando um Patch no svn

Algumas vezes há a necessidade de enviar as modificações do nosso código para outro lugar, para isto pode-se utilizar um patch do svn, caso nosso código esteja sobre este controle de versão.
Um patch nada mais é que um arquivo texto contendo todas as alterações , como por exemplo linhas adicionadas ou removidas. Este patch pode ser relacionado a um ou mais arquivos, em em diferentes pastas, desde que estejam no mesmo checkout do svn.

Criando um Path
Para criar um arquivo path, deve-se ir até a pasta raiz do checkout, onde encontram-se as modificações, e executar o comando abaixo:

svn diff > ~/patch_my_project.diff

Um arquivo com a extensão diff será gerado. Esta extensão é reconhecida por muitos editores de texto e também pela versão gráfica para windows do svn, o tortoise.

Aplicando um patch
Antes de se aplicar um patch, deve-se abrir em um editor de textos e ler as modificações existentes, para que se tenha certeza do que estará sendo aplicado. Após aplicar o patch, as modificações devem ser testadas e verificadas novamente antes de um commit ser realizado.
Para aplicar o patch utilizamos o comando abaixo, novamente na pasta raiz do checkout.

patch -p0 -i ~/patch_my_project.diff

A opção -p0 garante que todos os arquivos sejam achados corretamente. A opção -i informa que o parâmetro a seguir será utilizado como entrada para o patch.

Para aplicar pelo tortoise, de dentro da pasta raiz do checkout  acessa-se o menu de contexto "TortoiseSVN", e em seguida o menu "Apply patch...", uma tela onde as diferenças serão mostradas é aberta, além de uma caixa de diálogo para se escolher o arquivo de diferença. Após o arquivo ser escolhido, uma lista dos arquivos contidos no patch será mostrada, onde pode-se escolher o arquivo para verificar as modificações, além de aplicar o patch.

Após este comando a aplicação pode ser compilada, testada e então o commit pode ser realizado.

2 comentários:

  1. Olá Luiz!

    Sou meio nessa área e gostei muito do seu post.

    Simples e explicativo!! Executei na minha máquina e para cada arquivo alterado faz a seguinte pergunta no terminal:

    patching file file_example
    Reversed (or previously applied) patch detected! Assume -R? [n]

    A partir desse ponto, se eu escolho "y" ou "n" ele cria uma arquivo no meu projeto, referente ao arquivo alterado e coloca extensão .orig ou .rej

    Isso é normal?? Como faço para apenas aceitar minhas mudanças??

    Abs!!

    Carlos Heitor

    ResponderExcluir
    Respostas
    1. Olá Carlos, é possível que a árvore que vocês está aplicando esse patch esteja diferente da original. Ou seja, ela sofreu alguma modificação.
      O que está acontecendo é que o svn está rejeitando as modificações do seu patch.
      Você pode utilizar a opção "-m" --merge Merge using conflict markers instead of creating reject files. O que acontecerá aqui... Dentro do seu arquivo, serão incluidas as duas partes conflitantes, onde vc deve editar o arquivo, escolher como deve ficar a alteração no final, tirar qualquer linha parecida com >>>>mine ou <<<orig, etc... e depois indicar ao svn que o conflito daquele arquivo foi resolvido.
      Você pode verificar mais opções do patch rodando patch --help

      Excluir