2012-02-13 13 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をフック(だけで私のレポ(複数可)へのパスを追加する必要がありましたそれぞれの 'svn'コマンドの終わり)。注意: 'pre-revprop-change'フックを有効にし、' revprop'コマンドで0を返す必要があります。 –

答えて

19

新しいとsvnadmin load編集したデータを作成します。 old_usernameがコミットしたログのリビジョン:

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

このコマンドは、ログを取得し、各リビジョンの開始時に表示される行を検索し、最初の文字を削除します(すなわち、 r)を削除してから、リビジョンである行の最初の残りの部分をとります。

この情報は、さまざまな方法で使用できます。

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を置き換える:bashではあなたはそれがでsvn propsetコマンドのシーケンスを生成作ることができます適切なリビジョン値。

+0

完璧、私が探していたソリューションのタイプとまったく同じです。 – inquam

+1

noobsのヒント(私のような):repoではなく作業コピーの中に入力してください;) –

-5
  1. svnadmin dump
  2. 編集ダンプ・ファイル
  3. キル古いレポ
  4. さて、あなたが取得するコマンドを構築することができ
+0

borribleのメソッドは、大量のダンプファイルを扱うよりはるかに安全で簡単です。また、ダンプファイルを編集することは、サブバージョンのツールチェーンに関してはサポートされていません。なぜ仕事のためのツールフィッティングがある場合、危険な方法を使用するのですか? –

+0

ダンプファイルはどのように編集しますか?手動でやっていますか?これを行うには自動化された方法がありますか? OPは、レポを取らず手動でダンプを編集することなく、著者を変更する方法を知っています(悪い変更はリポジトリ全体を破壊する可能性があるため推奨しません)。作者は単にプロセスを自動化する方法を望んでいます。 –

0

これは最後のsystemコマンドまでテストしました。 (私は私のリポジトリを変更したくなかった)が、このPerlプログラムは動作するはずです:フォルダと呼ばれるもので(メモ帳で開くことで)あなたの前のリビジョン属性-change.batに次の

#! /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

挿入しますこのよう 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 
関連する問題