在Subversion中更改旧提交的作者

时间:2012-02-13 15:55:14

标签: svn

我的用户直到今天都被称为 foo.bar 。现在该用户将从此处被称为 fb 。但是我想更新所有旧提交以反映此用户名而不是旧用户名出于统计原因等。如何做到这一点?

我知道语法

svn propset --revprop -r revision_number svn:author your_username

但这需要大量的体力劳动。是否有现有的函数或脚本只需要替换名称和用?替换它的名称?

更新

这是我为处理这个问题而编写的一个小脚本,因为我将在很多用户的许多回购中执行此操作:) 只需在您选择的签出存储库文件夹中运行它。请注意,脚本中的错误处理最少。

https://github.com/inquam/svn-rename-author

4 个答案:

答案 0 :(得分:20)

您可以构建一个命令来获取old_username已提交的日志中的修订:

svn log | grep "^r[0-9]* | old_username |" | cut -c 2- | awk '{print $1}'

此命令获取日志,搜索出现在每个修订开头的行,从这些行中删除第一个字符(即r),然后获取该行的第一个剩余部分,即修订版。

您可以通过多种方式使用此信息。在bash中,您可以使用以下内容生成svn propset命令序列:

for f in `svn log | grep "^r[0-9]* | old_username |" | cut -c 2- | awk '{print $1}'`
do
svn propset --revprop -r $f svn:author your_username
done

迭代第一个表达式(现在在反引号中)创建的值,并将这些值用于svn propset命令,用适当的修订值替换$f

答案 1 :(得分:3)

将以下内容插入pre-revprop-change.bat(在记事本中打开),在一个名为this的文件夹中(取决于您的配置) C:\ ASP.NET Projecten \ ProjectX \ hooks

set magProperyWijzigen = false;
:: Only allow the log message and author to be changed.
if("%propertyName%" == "svn:author") magProperyWijzigen = true;
if("%propertyName%" == "svn:log") magProperyWijzigen = true;

if "%magProperyWijzigen%" == "false" goto ERROR_PROPNAME

答案 2 :(得分:0)

我已经测试了这个,直到最后一个system命令。 (我不想更改我的存储库),但是这个Perl程序应该可以工作:

#! /usr/bin/env perl
#

use strict;
use warnings;
use feature qw(say);
use autodie;   #Don't have to test if open fails

use constant {
    SVN      => "svn",
    REPOS    => "http://source/src/myrepo",
    OLD_NAME => "dbrown",
    NEW_NAME => "db",
};

open (my $log, "-|", LOG_CMD);

while (my $line = <$log>) {
    chomp $line;

    #
    # Is this a revision line?
    #

while (my $line = <$log>) {
    chomp $line;
    next unless $line =~ /^r       #Line starts with an "r"
                         (\d+)     #Followed by digits (Capture)
                         \s\|\s    #And a "|" separator
                         ([^\|]+)  #This should be the name (Capture)
                         \s+\|     #And another separator
                         /x;
    my $revision = $1;
    my $author = $2;
    next unless $author eq OLD_NAME;

    #
    # Found the Author
    #
    my $command = qq(@{[SVN]} -r $revision pset --revprop svn:author @{[NEW_NAME]});
    my $error = system $command;
    say STDERR qq(Couldn't modify revision $revision) if $error;
}

答案 3 :(得分:-6)

  1. svnadmin dump
  2. 编辑转储文件
  3. 杀死旧回购
  4. 创建新的svnadmin load已编辑数据