我想自动化这个过程:
例如如果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上实现吗?什么是命令(或命令行以外的方式)?是否存在涵盖这些操作所需命令的文档?
答案 0 :(得分:1)
你需要知道刚刚提交的修订版,然后检查/切换到分支B,如果修订版是123和125,则需要svn merge -c 123,125。
答案 1 :(得分: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;