0

我想自动化这个过程:

  1. 一个数字来自外部系统,比如 35。
  2. 搜索并找到在分支 A 的评论中有 #35 的 svn 提交。
  3. 列出这些提交对它们之前的提交的所有更改。
  4. 将此更改应用于分支 B。

例如,如果 rev 95 的注释中有 #35 并在 rev 94 上引入了一个新文件,则添加此 [Add File x.txt]。rev 132 的注释中有 #35,它在 x.txt 中更改了一行。也添加这个[更改第 n 行,文件 x.txt]。等等。现在我们有一个更改列表:

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

将此更改应用于分支 B。

这可以在svn上实现吗?命令是什么(或命令行以外的方式)?是否存在涵盖这些操作的必要命令的文档?

4

2 回答 2

1

您需要知道刚刚提交的修订版,然后签出/切换到分支 B,如果修订版是 123 和 125,则需要 svn merge -c 123,125。

另请参阅有关合并的 SvnBook

于 2009-06-13T20:55:28.650 回答
1

如果您的开发人员有足够的纪律,总是在提交日志消息中写入票号,您可以使用这个 Perl 脚本来搜索日志消息包含指定单词的修订。首先签出分支 B 的工作副本,然后在工作副本中运行

perl merge-ticket.pl searchWord sourceURL

指定分支 A 的票号和存储库 URL。脚本将分支 A 中的匹配修订合并到工作副本中。

# 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;
于 2009-06-14T19:32:04.270 回答