Измените автора старых коммитов в Subversion

У меня есть пользователь, который до сегодняшнего дня был вызван foo.bar. Теперь этот пользователь будет известен как fb, а не здесь. Но я хотел бы обновить все старые коммиты, чтобы отразить это имя пользователя вместо старого по статистическим причинам и т.д. Как это можно сделать?

Я знаю о синтаксисе

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

Но для этого потребуется много ручного труда. Есть ли существующая функция или script, которая просто заменяет имя и имя, чтобы заменить его?

Update:

Вот небольшой script, который я сделал для этого, так как я буду делать это во многих репозиториях для многих пользователей:) Просто запустите его в выбранной папке репозитория по вашему выбору. Обратите внимание, что обработка ошибок минимальна в script.

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

Ответ 1

Ну, вы можете создать команду для получения изменений в журнале, который 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

который выполняет итерацию над значениями, созданными первым выражением (теперь в backquotes), и использует эти значения для вашей команды svn propset, заменив $f на соответствующее значение ревизии.

Ответ 2

Вставьте следующее в свой pre-revprop-change.bat(открыв его в блокноте) в папке, названной примерно так (в зависимости от вашей конфигурации) 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

Ответ 3

Я тестировал это до последней команды 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;
}

Ответ 4

  • svnadmin dump
  • Редактировать файл дампа
  • Убить старое репо
  • Создать новые и svnadmin load отредактированные данные