it-swarm-pt.tech

Confirmações Parciais com o Subversion

Dado o caso eu fiz duas mudanças independentes in one arquivo: por exemplo. adicionou um novo método e mudou outro método.

Muitas vezes não quero confirmar as duas alterações como one commit, mas como two commits independentes.

Em um repositório git eu usaria o Modo Interativo de git-add (1) para dividir o hunk em outros menores:

 git add --patch

Qual é a maneira mais fácil de fazer isso com o Subversion? (Talvez até usando um plug-in do Eclipse)

Atualização:
Em The Thing About Git , Ryan o chama: “O Problema da Cópia de Trabalho Tangled.”

96
Benedikt Waldvogel

Com o git-svn você pode criar um repositório GIT local do repositório SVN remoto, trabalhar com ele usando o conjunto completo de recursos do GIT (incluindo commits parciais) e, em seguida, enviar tudo de volta para o repositório SVN.

git-svn (1)

32
jkramer

Tortoise SVN 1.8 agora suporta isso com o seu recurso "Restore after commit". Isso permite que você faça edições em um arquivo, com todas as edições desfeitas após o commit

Pela documentação:

Para confirmar apenas as partes do arquivo relacionadas a um problema específico:

  1. na caixa de diálogo de submissão, clique com o botão direito no arquivo, escolha "restaurar após confirmar"
  2. editar o arquivo em, e. TortoiseMerge: desfaça as mudanças que você não quer cometer ainda
  3. salve o arquivo
  4. confirme o arquivo
58
Casebash

Eu fiz isso usando TortoiseSVN .

O utilitário de mesclagem embutido permite que você mostre uma diferença entre a versão do repositório e sua cópia de trabalho.

Use a função create backup do utilitário diff

  1. Vá para confirmar seu arquivo como se você fosse comprometer todas as suas alterações.
  2. Na janela de commit, clique duas vezes no arquivo para mostrar um diff.
  3. Nas configurações de diff, clique na opção para backup do arquivo original
  4. Clique com o botão direito do mouse nas alterações que você não deseja e use select use outro bloco de texto.
  5. Salve o diff exatamente uma vez . O backup será sobregravado sempre que você salvar. É por isso que você só deseja salvar uma vez.
  6. Confirme a mudança.
  7. Sobrescreva o original com o arquivo .bak criado (que terá todas as alterações originais).
  8. Confirme seu arquivo.

Agora você deve ter todas as suas alterações confirmadas, usando dois commits separados.

42
Spike

Tente usar svn diff > out.patch e copie o arquivo out.patch para out.patch.add e out.patch.modify 

Somente quando você tem um arquivo de correção de trabalho reverta o arquivo original usando svn revert out.c.

Edite os arquivos de correção manualmente para que eles contenham apenas o hunks para adicionar ou modificar. Aplique-os ao arquivo original usando o comando patch, teste se a adição funcionou e, em seguida, svn commit a adição.

Lave a repetição da lavagem para o patch out.patch.modify.

Se as alterações forem separadas no arquivo, conforme sua pergunta inicial afirmou - adicionou um novo método, alterou um método existente - isso funcionará

Esta é uma solução muito tediosa - embora não esteja convencido de que você deva ter algum motivo para separar seus commits.

Você também pode ter feito várias cópias de trabalho da mesma fonte para aplicar seu trabalho:

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

Certifique-se de svn up e teste para ter certeza de que tudo está bem.

25
Chris

Isto é possível usando o TortoiseSvn (Windows) desde a v1.8.

4.4.1. O diálogo de confirmação

Se sua cópia de trabalho estiver atualizada e não houver conflitos, você estará pronto para confirmar suas alterações. Selecione qualquer arquivo E/ou pastas que você quer cometer, então TortoiseSVN → Commit ....

<recorte>

4.4.3. Confirme apenas partes de arquivos

Às vezes, você quer apenas confirmar partes das alterações feitas em um arquivo. Tal situação geralmente Acontece quando você está trabalhando em alguma coisa, mas então uma correção urgente precisa Ser confirmada, e essa correção está no mesmo arquivo que você está trabalhando em. 

clique com o botão direito do mouse no arquivo e use Menu de Contexto → Restaurar após confirmar. Isso criará uma cópia do arquivo como está. Então você pode editar o arquivo , Por exemplo no TortoiseMerge e desfaça todas as mudanças que você não quer confirmar. Depois de salvar essas alterações, você pode confirmar o arquivo. 

Depois que o commit é feito, a cópia do arquivo é restaurada Automaticamente, e você tem o arquivo com todas as modificações que Não foram confirmadas.

No Linux, eu daria http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php a try. Não tentei eu mesmo, no entanto.

10
parvus

Eu costumava fazer isso:

  • No meu editor (eu uso o vim), edite o arquivo para que apenas uma das alterações apareça
  • Salve o arquivo (mas não saia do editor)
  • Confirme o arquivo alterado para svn
  • Clique em "desfazer" no editor várias vezes para que o segundo conjunto de alterações reapareça
  • Salve o arquivo novamente
  • Confirme o segundo conjunto de alterações.

Essa é uma abordagem simplista que pressupõe que um conjunto de alterações seja razoavelmente fácil de desfazer. Para situações mais complexas, eu desistiria e comprometeria ambas as mudanças sem me preocupar com isso.

Agora que eu uso o git, isso é algo que eu espero nunca mais ter que fazer!

8
Greg Hewgill

Eu uso um repositório de darcs local ou apenas mescle as alterações gradualmente. Com a fusão (o opendiff abre o FileMerge, um programa de mesclagem que vem com o Xcode; substitua pela sua ferramenta de mesclagem favorita):

cp file file.new
svn revert file
opendiff file.new file -merge file

mesclar as alterações relacionadas, salvar a mesclagem, encerrar o programa de mesclagem

svn ci -m 'first hunk' file
mv file.new file
svn ci -m 'second hunk' file

se mais de um pedaço não relacionado no arquivo, enxaguar e repetir (mas por que você esperaria tanto tempo antes de cometer?)

Além disso, se você souber git, você pode usar git-svn para manter um repositório git local e sincronizar seus commits para um servidor mestre svn; funciona muito bem na minha experiência limitada.

5
Aeon

Tente VisualSVN para o Visual Studio . O latest 6.1 release introduz o recurso QuickCommit. Você pode confirmar parcialmente as alterações selecionadas em um arquivo usando os novos comandos de menu Commit this Block e Commit Selection menu de contexto no editor do Visual Studio.

enter image description here

3
bahrep
  1. Abra todos os arquivos que você deseja dividir no editor de escolha
  2. Usando um conjunto de ferramentas diferente (no Win, use a sugestão de Spike (a versão antiga)) de volta ao segundo conjunto
  3. Commit
  4. volte para o seu editor de escolha e salve todos os arquivos

É um pouco mais arriscado do que a sugestão completa de Spike, mas pode ser mais fácil de fazer. Além disso, certifique-se de experimentá-lo em outra coisa primeiro, pois alguns editores se recusarão a salvar um arquivo que tenha sido alterado a menos que você recarregue esse arquivo (perdendo todas as alterações)

2
BCS

Eu acho que uma opção mais fácil do que gerar arquivos diff, revertendo, etc, seria ter duas cópias do repositório retiradas, e usar uma ferramenta de comparação visual como DeltaWalker para copiar pedaços de um para o outro.

A primeira cópia seria a que você realmente trabalha, e a segunda seria apenas para esse propósito. Depois de fazer uma tonelada de alterações na primeira, você pode copiar uma seção para a segunda, confirmá-la, copiar outra seção, confirmá-la, etc.

0
Ian Dunn
  1. Copie todos os arquivos modificados em questão para cópias de backup.
  2. Crie um patch do estado de trabalho usando svn diff.
  3. Reverta os arquivos usando svn revert.
  4. Aplique novamente as partes do patch que você deseja confirmar, usando a ferramenta patch ou editando manualmente, ou o que for.
  5. Execute diff posteriormente para comparar sua cópia de trabalho com seu back-up para ter certeza de que você aplicou as partes do patch corretamente.
  6. Construa e teste.
  7. Commit.
  8. Copie suas cópias de segurança de volta para o seu check-out do repositório.
  9. Repita em 2. (não em 1.!) Até terminar.
0
michaeljt