Change author of old commits in Subversion

前端 未结 4 516
渐次进展
渐次进展 2020-12-29 03:20

I have a user that has, up until today, been called foo.bar. Now that user will be known as fb instead from here on. But I would like to up

相关标签:
4条回答
  • 2020-12-29 03:59

    Insert the following into your pre-revprop-change.bat (by opening it in notepad) in a folder called something like this (depending on your configuration) 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
    
    0 讨论(0)
  • 2020-12-29 03:59
    1. svnadmin dump
    2. Edit dump-file
    3. Kill old repo
    4. Create new and svnadmin load edited data
    0 讨论(0)
  • 2020-12-29 04:02

    You can build a command to get the revisions in the log which old_username has committed with:

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

    This command gets the logs, searches for lines that appear at the start of each revision, drops the first character (i.e. the r) from those lines and then takes the first remaining part of the line, which is the revision.

    You can use this information in a variety of ways. In bash you could make it produce the sequence of svn propset commands with:

    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
    

    which iterates over the values created by the first expression (now in backquotes) and uses those values for your svn propset command, replacing the $f with the appropriate revision value.

    0 讨论(0)
  • 2020-12-29 04:18

    I've tested this until the last system command. (I didn't want to change my repository), but this Perl program should work:

    #! /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;
    }
    
    0 讨论(0)
提交回复
热议问题