2012-02-13 2 views
25

나는 오늘까지까지 foo.bar이라는 사용자가 있습니다. 이제 해당 사용자는 fb으로 표시됩니다. 하지만 이전의 커밋을 모두 업데이트하여 통계적 이유로 인해 이전 사용자 이름 대신이 사용자 이름을 반영하고 싶습니다. 어떻게 할 수 있습니까?Subversion에서 이전 커밋의 저자 변경

나는 구문

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

에 대해 알고하지만 그 육체 노동을 많이 필요합니다. 대체 할 이름과 바꿀 이름이있는 기존 함수 또는 스크립트가 있습니까?

업데이트 : 여기

은 내가 많은 사용자를 위해의 repos의 많은에이 일을하기 때문에이 문제를 처리하기 위해 만든 작은 스크립트입니다 :) 는 그냥 체크 아웃 저장소 폴더에 실행 너의 선택의. 오류 처리는 스크립트에서 최소한입니다.

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

+1

1 후크 (단지 나의 REPO (들)에 경로를 추가했다 각'svn' 명령의 끝). 참고 :'pre-revprop-change' 훅이 활성화되어야하고'revprop' 명령에서 0을 리턴해야합니다. –

답변

19

음을 죽이고, 당신은을 얻을 수있는 명령을 구축 할 수 있습니다 old_username 님이 커밋 한 로그의 수정본 :

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

이 명령은 로그를 가져 와서 각 개정의 시작 부분에 나타나는 행을 검색하고 첫 번째 문자를 삭제합니다 (예 : r)을 수정 한 다음 줄의 처음 부분 인 개정판을 사용합니다.

이 정보는 다양한 방법으로 사용할 수 있습니다. bash에서 당신은과 svn propset 명령의 순서를 생성 할 수있다 :

(지금 역 인용 부호의) 첫 번째 표현식에 의해 생성 된 값을 반복하고이 함께 $f을 대체하여 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 

적절한 개정 값.

+0

완벽하고 정확한 솔루션 유형입니다. – inquam

+1

noobs (나 같은)에 대한 힌트 : repo가 ​​아닌 작업 복사본의 내부에 입력하십시오.) –

-5
  1. svnadmin dump
  2. 편집 덤프 파일이
  3. 이 새로 만들기 기존의 repo 및 svnadmin load 편집 된 데이터
+0

붕주의 방법은 부피가 큰 덤프 파일을 사용하는 것보다 훨씬 안전하고 쉽습니다.또한 덤프 파일 편집은 서브 버전 툴 체인의 측면에서 지원되지 않습니다. 왜 직장에 맞는 도구가 있다면 위험한 방법을 사용합니까? –

+0

덤프 파일을 어떻게 편집합니까? 이 작업을 수동으로 수행합니까, 아니면이를 자동화 한 방법이 있습니까? OP는 repo를 사용하지 않고 수동으로 덤프를 편집하지 않고 작성자를 변경하는 방법을 알고 있습니다. 나쁜 변경으로 인해 전체 repo가 ​​손상 될 수 있으므로 권장하지 않습니다. 저자는 단순히 프로세스를 자동화하는 방법을 원합니다. –

0

마지막으로 system 명령까지 테스트했습니다. (내 저장소를 변경하지 않았다)하지만,이 펄 프로그램이 작동합니다 : 폴더라는 뭔가 (메모장을 열어) 당신의 사전 revprop-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 
관련 문제