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

開発者が常にコミット ログ メッセージにチケット番号を書き込むように訓練されている場合は、ログ メッセージに特定の単語が含まれるリビジョンを検索するこの 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 に答える
1

コミットされたばかりのリビジョンを確認し、チェックアウト/ブランチ B に切り替え、リビジョンが 123 と 125 の場合は svn merge -c 123,125 を実行する必要があります。

マージに関する SvnBookも参照してください

于 2009-06-13T20:55:28.650 に答える