2012-02-13 96 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