2012-02-13 3 views
25

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

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

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

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

Update:

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

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

+1

+1 за сценарий, который работает так же, как ожидалось (только должен был добавить путь к моей репо (ов) в конец каждой команды 'svn'). Примечание: крючок «pre-revprop-change» должен быть активирован и возвращать 0 на команду «revprop» –

ответ

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

+1

Подсказка для noobs (как и я): введите это внутри рабочей копии, а не репо;) –

-5
  1. svnadmin dump
  2. Редактировать дамп-файл
  3. Убей старый репозиторий
  4. Создать новый и svnadmin load отредактированные данные
+0

Метод borrible намного безопаснее и проще, чем прокручивать громоздкими дамп-файлами.Также редактирование dumpfiles не поддерживается с точки зрения инструментальной подвязки. зачем использовать рискованный метод, если есть подходящий инструмент для работы? –

+0

Как вы редактируете файл дампа? Вы делаете это вручную, или есть автоматизированный способ сделать это? OP знает, как изменить автора, не снимая репо и вручную редактируя дамп (что не рекомендуется, так как плохое изменение может уничтожить все репо). Автору просто нужен способ автоматизации процесса. –

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

Вставьте следующий код в ваш предварительно 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 
Смежные вопросы