Mesclar uma ramificação no tronco

125

Estou enfrentando um problema peculiar com o SVN merge. Quero mesclar de um ramo de desenvolvimento para o tronco. Temos vários ramos de desenvolvimento cortados o tronco ao mesmo tempo.

Estou mesclando um desses ramos ao tronco com este comando:

svn merge trunk branch_1

Vejo alterações que não fazem parte deste ramo, sendo mescladas no tronco. O que estou fazendo de errado ?

Versão SVN:

Cliente de linha de comando do Subversion, versão 1.6.16-SlikSvn-tag-1.6.16@1076804-WIN32.

Vanchinathan Chandrasekaran
fonte
7
Eu sei que isso não é uma resposta, mas se você tiver vários ramos ativos simultaneamente, provavelmente será melhor mudar para mercurial ou git. Ps: Eu não sou um fanático, eu tenho trabalhado com svn para ~ 7 anos ;-)
zerkms
2
Que vantagem isso oferece? Por que mudar para git ou mercurial é uma escolha melhor?
Vanchinathan Chandrasekaran
3
porque git e mercurial têm um suporte muito melhor aos ramos. Vantagens: você não vai fazer essas perguntas e terá menos dores de cabeça sobre a criação e manutenção de filiais (atualmente estou trabalhando em um projeto com> 1000 ramos, em svn era um inferno para trabalhar com eles)
zerkms
Eu recomendo olhar para Svnmerge.py e revisar este artigo .
chown

Respostas:

215

Sua svn mergesintaxe está errada.

Você deseja fazer check-out de uma cópia de trabalho trunke usar a svn merge --reintegrateopção:

$ pwd
/home/user/project-trunk

$ svn update  # (make sure the working copy is up to date)
At revision <N>.

$ svn merge --reintegrate ^/project/branches/branch_1
--- Merging differences between repository URLs into '.':
U    foo.c
U    bar.c
 U   .

$ # build, test, verify, ...

$ svn commit -m "Merge branch_1 back into trunk!"
Sending        .
Sending        foo.c
Sending        bar.c
Transmitting file data ..
Committed revision <N+1>.

Consulte o capítulo do livro SVN sobre a fusão para obter mais detalhes.


Observe que, no momento em que foi escrito, essa era a resposta certa (e foi aceita), mas as coisas seguiram em frente. Veja a resposta de topek e http://subversion.apache.org/docs/release-notes/1.8.html#auto-reintegrate

blahdiblah
fonte
4
opção --reintegrate não é obrigatória, filial (em 1.6) pode ser mesclado com qualquer-destino qualquer número de vezes
preguiçoso Badger
1
Realmente? Sem arriscar reler os mesmos conjuntos de alterações? Você pode fornecer um link para corroborar evidências disso, por favor.
Neutrino
--reintegrateNa verdade, não é obrigatório, mas é realmente recomendado neste caso. Eu tentei fazê-lo sem --reintegratee acabei com centenas de conflitos. Com --reintegrate, sem conflitos e tudo foi bom!
tibo 12/09
17
A --reintegrateopção é simples e eficaz, mas deve-se observar que "Depois que uma --reintegratemesclagem é feita de ramificação para tronco, a ramificação não é mais utilizável para trabalhos futuros. Ela não é capaz de absorver corretamente novas alterações de tronco, nem pode ser reintegrada adequadamente. troncar novamente. " conforme explicado pelo livro que você vinculou.
Pino
3
@daveL, forward mescla de tronco em ramo faz sentido para mim. No entanto, encontrei um recurso avançado para "manter viva uma ramificação reitegrada" (consulte stackoverflow.com/a/10163059/685806 ), além disso, é aplicada automaticamente pelas versões mais recentes do cliente.
Pino
78

Se o diretório ativo apontar para o tronco, você poderá mesclar sua ramificação com:

svn merge https://HOST/repository/branches/branch_1

certifique-se de emitir este comando no diretório raiz do seu tronco

topek
fonte
7
A partir do SVN 1.8. Esta é a resposta certa. Veja subversion.apache.org/docs/release-notes/…
GreenAsJade
@blahdiblah o snippet de código tem muitas informações estranhas. Há uma razão pela qual o resumo dos estudos recebe ordens de magnitude de leitura mais do que qualquer outra parte de um estudo. O mesmo vale para os testes UX, minimizando as taxas de rejeição, etc. É o mesmo princípio.
Ahnbizcad 17/10/2015
com o 1.7, você pode mesclar sem a opção --reintegrate, continuar desenvolvendo no ramo e continuar mesclando. Infelizmente, 1.8 forçará isso a ser uma reintegração e não parece haver uma maneira de evitá-lo. Isto significa, logo que você mesclar, você não pode usar o ramo sem passar pela "dança keep-alive" temido
John Pouco
3
Não se esqueça de enviar a cópia de trabalho do tronco de volta ao repositório após a mesclagem!
John
16

Faça uma atualização svn no tronco, anote o número da revisão.

Do tronco:

svn merge -r<revision where branch was cut>:<revision of trunk> svn://path/to/branch/branchName

Você pode verificar onde o ramo foi cortado do tronco fazendo um log svn

svn log --stop-on-copy
Mike K.
fonte
Como existem vários ramos de desenvolvimento que estão ativos ao mesmo tempo, isso também não estava funcionando para mim, esse comando também estava trazendo alterações de outros ramos. Pode ser que este seja um problema com o SLik SVN client?
Vanchinathan Chandrasekaran
Embora isso não seja impreciso, existem maneiras mais fáceis de mesclar com versões mais recentes svn(como a que o OP está usando).
blahdiblah
@VanchinathanChandrasekaran, no comando você especifica o nome do ramo, pois svn://path/to/branch/branchNameisso deve extrair apenas as alterações desse ramo e não de outros ramos. Se assim for, estamos em perigo!
Fredrick Gauss
1

A sintaxe está errada, deve ser

svn merge <what(the range)> <from(your dev branch)> <to(trunk/trunk local copy)>
lwpro2
fonte