svn: Cómo automatizar la transferencia de commits entre sucursales

Quiero automatizar este process:

  1. Un número proviene de un sistema externo, digamos 35.
  2. Busque y encuentre los commit svn que tienen # 35 en sus comentarios en la twig A.
  3. Haga una list de todos los cambios de estos commits a los commits antes que ellos.
  4. Aplica estos cambios a la twig B.

Por ejemplo, si rev 95 tiene el # 35 en sus comentarios e introdujo un nuevo file a través de la versión 94, agregue este [Agregar file x.txt]. Y rev 132 tiene el # 35 en sus comentarios y cambió una línea en x.txt. Agregue esto también [Cambiar línea n, file x.txt]. Y así. Ahora tenemos una list de cambios:

[Add File x.txt] [Change line n, file x.txt] ... 

Aplica estos cambios a la twig B.

¿Se puede lograr esto en svn? ¿Cuáles son los commands (o una forma distinta de la command-line)? ¿Existe una documentation que cubra los commands necesarios para estas operaciones?

Necesita saber la (s) revisión (es) que se acaba de realizar, luego verificar / cambiar a la twig B, y svn fusionar -c 123,125 si las revisiones fueron 123 y 125.

Ver también SvnBook en fusión

Si sus desarrolladores son lo suficientemente disciplinados como para escribir siempre el número del ticket en el post de logging de compromiso, puede usar este script Perl que busca revisiones donde el post de logging contiene una palabra específica. Primero compruebe una copy de trabajo de la twig B, luego dentro de la copy de trabajo, ejecute

 perl merge-ticket.pl searchWord sourceURL 

especificando el número de ticket y el URL del repository para la twig A. El script combina las revisiones coincidentes de la twig A en la copy de trabajo.

 # merge-ticket.pl use strict; use XML::Parser; if ($#ARGV != 1) { die "usage: $0 searchWord sourceURL\n"; exit 1; } my $searchWord = $ARGV[0]; my $sourceUrl = $ARGV[1]; my @revisions = (); my $revision; my $inMsg; my $message; sub startTag { my($parser, $tag, %attrs) = @_; if ($tag eq 'logentry') { $revision = $attrs{'revision'}; } elsif ($tag eq 'msg') { $inMsg = 1; $message = ''; } } sub endTag { my($parser, $tag) = @_; if ($tag eq 'msg') { $inMsg = 0; if ($message =~ /\b$searchWord\b/) { push(@revisions, $revision); print "$revision: $message\n"; } } } sub characterData { my($parser, $data) = @_; if ($inMsg) { $message .= $data; } } # Search commit log messages for word. my $command = "svn log --xml $sourceUrl"; open(INPUT, "$command|") || die "Error executing $command: $!\n"; my $parser = new XML::Parser( Handlers => { Start => \&startTag, End => \&endTag, Char => \&characterData}); $parser->parse(*INPUT); close(INPUT); if ($#revisions < 0) { print "No log messages containing $searchWord found\n"; exit 1; } # Merge found revisions into working copy. my $changes = join(',', reverse(@revisions)); $command = "svn merge -c$changes $sourceUrl"; print "$command\n"; system $command;