2012-02-13 106 views
25

我有一个用户,直到今天,被称为foo.bar。现在该用户将被称为fb而不是从这里开始。但我想更新所有旧的提交,以反映这个用户名,而不是旧的提交出于统计的原因等。这怎么可以做?更改Subversion中旧提交的作者

我知道语法

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

但是,这将需要大量的手工劳动。是否有一个现有的函数或脚本只需要替换名称并将其替换为名称?

更新:

这里是我提出来处理这一点,因为我会在很多回购了大量的用户做这样的小脚本:) 只需在签出存储库文件夹运行你的选择。请注意,错误处理至少在脚本中。

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

+1

+1的预期,其工作只是脚本(刚在路径上添加到我的回购协议(S)每个'svn'命令的结尾)。注意:'pre-revprop-change'钩子必须被激活并且在'revprop'命令中返回0 – 2013-03-02 11:50:35

回答

19

好了,你可以建立一个命令来获得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与适当的修改值。

+0

完美的,正是我所寻找的解决方案类型。 – inquam 2012-02-14 07:54:50

+1

提示noobs(像我一样):在工作副本中输入这个内容,而不是回购;) – 2016-04-18 11:12:09

-5
  1. svnadmin dump
  2. 编辑转储文件
  3. 杀老回购
  4. 创建新svnadmin load编辑的数据
+0

糟糕的方法比笨重的dumpfiles摆弄更安全和容易。根据Subversion工具链不支持编辑dumpfiles。为什么使用风险的方法,如果有适合工作的工具? – 2012-02-13 22:06:45

+0

如何编辑转储文件?你是手动做这个,还是有自动化的方法来做到这一点? OP知道如何更改作者,而无需重新下载并手动编辑转储(由于不良的更改可能会破坏整个回购,因此不建议这样做)。作者只是想要一种使流程自动化的方法。 – 2012-02-13 22:07:15

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

将以下到您的pre-revprop-change.bat(在记事本打开它)在一个文件夹叫什么像这样(取决于您的配置) C:\ ASP.NET Projecten \ projectX创建\钩

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