Subversion에서 이미 커밋 된 로그 메시지를 편집하는 방법은 무엇입니까?


550

Subversion에서 특정 개정의 로그 메시지를 편집하는 방법이 있습니까? 커밋 메시지에 실수로 잘못된 파일 이름을 작성하여 나중에 혼란 스러울 수 있습니다.

나는 본 적이 내가 잘못된 힘내에서 커밋 메시지를 수정하려면 어떻게합니까? 그러나 그 질문에 대한 해결책은 Subversion과 비슷하지 않은 것 같습니다 (에 따르면 svn help commit).


26
나는이 질문을
찬성

6
코드 인 경우 주석을 작성하고 적절한 주석으로 다시 커밋하십시오. 실수를 반영한 ​​의견에 동의하면 훨씬 적은 노력과 훨씬 더 빠릅니다. 그렇지 않다면 Kamil Kisiel의 솔루션이 분명히 올바른 방법입니다.
marty

pre-revprop-change커밋 한 사용자가 커밋 후 최대 3 시간 동안 로그를 수정할 수 있는 훌륭한 스크립트가 있습니다. 이 유연성 / 정확한 로그 및 저장소의 충실도 유지 사이 좋은 타협 wandisco.com/svnforum/threads/...
JWA을

이 경우 파일을 변경하지만 여전히 새로운 커밋 메시지를 추가 할 수 없습니다 당신은 할 수svn propset dummyproperty 1 yourfile; svn commit yourfile -m yourmessage
mulllhausen

답변:


457

이를 위해서는 리포지토리에 대한 관리자 권한 (직접 또는 간접)이 있어야합니다. 모든 사용자가이를 수행 할 수 있도록 저장소를 구성하거나 서버에서 직접 로그 메시지를 수정할 수 있습니다.

Subversion FAQ (강조 광산) 의이 부분 을 참조하십시오 .

로그 메시지는 각 개정에 첨부 된 특성으로 저장소에 보관됩니다. 기본적으로, 로그 메시지 특성 (svn : log)은 일단 커밋되면 편집 할 수 없습니다 . 이는 svn : log가 1 인 개정 속성을 변경하면 속성의 이전 값이 영구적으로 삭제되고 Subversion이 실수로이를 수행하지 못하게하기 때문입니다. 그러나 Subversion이 개정 속성을 변경하도록하는 몇 가지 방법이 있습니다.

첫 번째 방법은 저장소 관리자가 개정 특성 수정을 사용하는 것입니다. 이것은 "pre-revprop-change"라는 후크를 작성하여 수행됩니다 (이 작업을 수행하는 방법에 대한 자세한 내용은 Subversion 책의이 섹션 참조). "pre-revprop-change"후크는 이전 로그 메시지가 변경되기 전에 액세스 할 수 있으므로 어떤 방식 으로든 (예 : 이메일 전송) 보존 할 수 있습니다. 개정 속성 수정이 활성화되면 --revprop 스위치를 다음 중 하나와 같이 svn propedit 또는 svn propset에 전달하여 개정의 로그 메시지를 변경할 수 있습니다.

$svn propedit -r N --revprop svn:log URL 
$svn propset -r N --revprop svn:log "new log message" URL 

여기서 N은 로그 메시지를 변경하려는 개정 번호이고 URL은 리포지토리의 위치입니다. 작업 복사본 내에서이 명령을 실행하면 URL을 생략 할 수 있습니다.

로그 메시지를 변경하는 두 번째 방법은 svnadmin setlog를 사용하는 것입니다. 파일 시스템에서 리포지토리의 위치를 ​​참조하여 수행해야합니다. 이 명령을 사용하여 원격 저장소를 수정할 수 없습니다.

$ svnadmin setlog REPOS_PATH -r N FILE

여기서 REPOS_PATH는 저장소 위치이고, N은 로그 메시지를 변경하려는 개정 번호이고, FILE은 새 로그 메시지를 포함하는 파일입니다. "pre-revprop-change"훅이 제자리에 있지 않은 경우 (또는 어떤 이유로 훅 스크립트를 우회하려는 경우) --bypass-hooks 옵션을 사용할 수도 있습니다. 그러나이 옵션을 사용하기로 결정한 경우 매우주의하십시오. 변경 사항에 대한 이메일 알림 또는 개정판 특성을 추적하는 백업 시스템과 같은 것을 무시할 수 있습니다.


15
2010 년 2 월 3 일 현재 URL은 subversion.apache.org/faq.html#change-log-msg
GreenMatt

1
다음은 svnadmin 옵션 svn-change-commit
albfan

2
감사! 답변 후 6.5 년이 지나도 여전히 유용합니다. :-)
Michael

propedit 메소드는 다소 작동했습니다. 그러나 repo 브라우저에 반영하도록 로그 변경을 얻을 수 없습니다. Windows의 svn 명령 줄에서만 업데이트 된 로그를 볼 수있었습니다. 마지막 단계로 로그 캐시를 새로 고쳐야했습니다. stackoverflow.com/questions/25750249/…
user_007 0

89

이 명령을 실행하면

svn propedit svn:log --revprop -r NNN 

이 메시지가 표시되는 경우를 대비하여

DAV 요청이 실패했습니다. 리포지토리의 pre-revprop-change 후크가 실패했거나 존재하지 않을 수 있습니다.

Subversion에서는 로그 메시지가 버전 화되지 않고 영구적으로 손실되므로 로그 메시지를 수정할 수 없기 때문입니다.

유닉스 호스팅 SVN

Subversion 서버의 hooks 디렉토리로 이동하십시오 (~ / svn / reponame을 저장소 디렉토리로 바꾸십시오)

cd ~/svn/reponame/hooks

확장을 제거

mv pre-revprop-change.tmpl pre-revprop-change

그것을 실행 가능하게 만드십시오 (chmod + x를 할 수 없습니다!)

chmod 755 pre-revprop-change

출처

Windows 호스팅 SVN

hooks 디렉토리의 템플리트 파일은 Unix 전용이므로 사용할 수 없습니다. Windows 배치 파일 pre-revprop-change.bat을 hooks 디렉토리 (예 : here 제공) 에 복사해야합니다 .


1
왜 " chmod + x를 할 수 없습니다 !"라고 괄호로 썼 습니까?
사도

1
나는 작은 스크립트를 만든 그 구현 여기에 같은 생각 blog.mmonem.com/enable-changing-svn-log
mmonem

svn propedit를 사용하기 전에 SVN_EDITOR, VISUAL 또는 EDITOR를 설정해야합니다.
Gerd

48

FAQ에서 언급하지 않은 편리한 변형이 있습니다. 텍스트 편집기를 지정하여 편집 할 현재 메시지를 반환 할 수 있습니다.

svn propedit svn:log --revprop -r N --editor-cmd vim

17
관리자 권한이 필요한 후크가 생성되어 있어야합니다. svn: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook
Matt

다음은 로그를 활성화하는 스크립트입니다. blog.mmonem.com/enable-changing-svn-log
mmonem

37
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt

Google 코드를 사용하고 있으므로이 방법으로 할 수는 없지만 감사합니다.
Jeremy Ruten

4
propedit 메소드가 "리포지토리에서 개정판 변경을 수락 할 수 없습니다"라는 메시지가 표시되어 실패했습니다. 감사!
pfctdayelise

1
직접 명령을 내리는 +1 :-) apache.org는 지금 다운되었고 주어진 링크를 따라갈 수 없었습니다 ...
Rafa

이 답변에는 더 많은 포인트가 필요합니다! 후크를 설정하지 않아도 사용하는 것이 좋습니다.
Peri Hartman 1

1
이 대답에 대한 범프는 후크를 설정하지 않고 나를 위해 일했으며 로그의 수정 날짜 / 시간을 변경하지 않았으며 메시지 만 보냈습니다.
segFaultCoder

17

나는 최근에 이것도 맡았다.

우리는 프로그래머가 자신의 커밋 메시지 만 수정하고 얼마나 멀리 되돌릴 수 있는지 제한하고 싶었습니다. 그날 커밋 된 로그 메시지를 수정하고 오타 등을 수정하도록 허용하기로 결정했습니다.

온라인으로 몇 가지 다른 예제를 본 후 함께 해킹했습니다. 우리는 Windows 환경에 있으므로 이것이 우리의 내용입니다 pre-revprop-change.bat.

@ECHO OFF

set repos=%1
set rev=%2
set user=%3
set propname=%4
set action=%5

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow changes to svn:log. The author, date and other revision
:: properties cannot be changed
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%propname%'=='svn:log' goto ERROR_PROPNAME

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow modifications to svn:log (no addition/overwrite or deletion)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%action%'=='M' goto ERROR_ACTION

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow user to modify their own log messages
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set AUTHOR=
for /f "delims=" %%a in ('svnlook author -r %REV% %REPOS%') do @set AUTHOR=%%a

if /I not '%AUTHOR%'=='%user%' goto ERROR_WRONGUSER

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow user to modify log messages from today, old messages locked down
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set DATESTAMP=
for /f "delims=" %%a in ('svnlook date -r %REV% %REPOS%') do @set DATESTAMP=%%a

for /F "tokens=1-2 delims= " %%a in ("%DATESTAMP%") do (
 set DATESTAMPDATE=%%a
 set DATESTAMPTIME=%%b )

:: Expects DATESTAMPDATE in the format: 2012-02-24
for /F "tokens=1-3 delims=-" %%a in ("%DATESTAMPDATE%") do (
 set DATESTAMPYEAR=%%a
 set DATESTAMPMONTH=%%b
 set DATESTAMPDAY=%%c )

:: Expects date in the format: Thu 08/01/2013
for /F "tokens=1-4 delims=/ " %%a in ("%date%") do (
 set YEAR=%%d
 set MONTH=%%b
 set DAY=%%c )

if /I not '%DATESTAMPYEAR%'=='%YEAR%' goto ERROR_MSGTOOOLD
if /I not '%DATESTAMPMONTH%'=='%MONTH%' goto ERROR_MSGTOOOLD
if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLD

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Make sure that the new svn:log message contains some text.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
 set bIsEmpty=false
)
if '%bIsEmpty%'=='true' goto ERROR_EMPTY

goto :eof

:ERROR_EMPTY
echo Empty svn:log properties are not allowed. >&2
goto ERROR_EXIT

:ERROR_PROPNAME
echo Only changes to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_WRONGUSER
echo You are not allowed to modify other user's log messages. >&2
goto ERROR_EXIT

:ERROR_MSGTOOOLD
echo You are not allowed to modify log messages older than today. >&2
goto ERROR_EXIT

:ERROR_EXIT
exit /b 1 

편집 : 이것에 대한 독창적 인 아이디어는 이 스레드 에서 나왔습니다 .


7
어떤 이유로 든 내 시스템 (Server 2012 및 VisualSVN 실행)의 마지막 날짜 check if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLD에서 두 변수 주위에 큰 따옴표로 전환해야했습니다. (얼마나 오래 걸 렸는지 믿지 못할 것입니다.) 그렇지 않으면 "== '02'는 현재 예상치 못한 것"(매월 둘째 날)과 같은 것을 얻습니다. 내 배치-fu는 그 이유를 알 수있을만큼 강하지는 않지만 다른 사람이 이상한 문제를 겪을 경우 도움이 될 수 있습니다.
Carl Bussema

@CarlBussema : 고마워요. 방금 나에게 큰 두통을 저장했다.
Daniel Szabo

1
또한 위 스크립트는 미국 날짜 형식 인 "2013 년 08 월 01 일 형식의 예상 날짜" 형식을 사용합니다 . 따라서 사용하지 않으면 해당 부분을 수정해야합니다. 제 경우에는 형식이 "mm.dd.yy"이며 요일이 없습니다.
Zitrax

이 멋진 답변의 멋진 변형입니다. stackoverflow.com/questions/6155/…
NateJ

17

Windows에서 Tortoise SVN 클라이언트 사용 :

  1. 프로젝트 폴더를 마우스 오른쪽 버튼으로 클릭하고 "로그 표시"를 선택하십시오.
  2. 로그 메시지 창에서 수정본을 마우스 오른쪽 단추로 클릭하고 "로그 메시지 편집"을 선택하십시오.

작동하지 않으면 서버의 SVN 설정 방법으로 인해 다른 응답을 읽으십시오.


고마워, 이것이 더 쉬운 해결책이었습니다, +1. 권한이 있어야합니다.
theGabyRod

12

이클립스와 같은 IDE를 사용하는 경우이 쉬운 방법을 사용할 수 있습니다.

Right click on the project -> Team - Show history

그 안에 right click on the revision id for your commit and select 'Set commit properties'.

여기에서 원하는대로 메시지를 수정할 수 있습니다.


적어도 TortoiseSVN에서는 커밋 로그에서 커밋에 대한 커밋 속성을 편집하려고하면 로그 메시지를 직접 편집하는 것과 같은 오류 메시지가 표시되면서 실패합니다.
Christian Severin

1
"DAV 요청이 실패했습니다. 리포지토리의 pre-revprop-change 후크가 실패했거나 존재하지 않을 수 있습니다. 리포지토리가 개정 propchanges를 수락 할 수 없습니다. 관리자에게 pre-revprop-change 후크를 생성하도록 요청하십시오." 그러나 내가 말했듯이 : Eclipse가 아닌 TortoiseSVN (관리자가 아닌 사람)을 사용하고 있습니다. 어쩌면 Eclipse는 SVN 권한을 해킹하여 후크를 만들 수 있습니다.
Christian Severin

아마도 요 일식으로 해보십시오.
mani_nz

@ChristianSeverin, Eclipse를 사용할 때 동일한 오류 메시지가 나타납니다. 반드시 Subversion 서버에서 온 것입니다.
GreenhouseVeg

10

리포지토리에서 pre-revprop-change 후크를 통해 수정 속성을 설정할 수 있으면 로그 메시지를 훨씬 쉽게 변경할 수 있습니다.

svn propedit --revprop -r 1234 svn:log url://to/repository

또는 TortoiseSVN, AnkhSVN 및 기타 많은 하위 버전 클라이언트에서 로그 항목을 마우스 오른쪽 버튼으로 클릭 한 다음 '로그 메시지 변경'을 클릭하십시오.


2
서브 클립 (Eclipse)에서는 "커밋 속성 설정"입니다.
pfctdayelise

2

서브 자주 묻는 질문 이 포함하지만, 같은 정의되지 않은 용어를 혼동 한 무리의 사용 REPOS_PATH실제 예제를 제공하지 않고 있습니다.

작동하려면 몇 번의 시도가 필요할 수 있으므로 업데이트 된 커밋 메시지를 파일에 저장하십시오. svn-commit.tmp파일 과 달리 Subversion은 문제가있을 경우 입력 내용을 보존하지 않습니다.

작업 디렉토리에서 다음을 실행하십시오.

svn propedit -r N --revprop svn:log

커밋 메시지를 편집합니다. 그것이 효과가 있다면, 훌륭합니다! 그러나 svn:logrevition 속성이 버전 화 되지 않고 Subversion은 기본적으로 후크 스크립트 pre-revprop-change 또는 후크 가없는 오류 메시지를 사용하여 덮어 쓰지 못하게 하기 때문에 아마 그렇지 않을 것입니다.

후크를 변경하려면 리포지토리가 호스팅되는 파일 시스템에 액세스해야합니다. svn info리포지토리 루트를 알려줍니다. 이라고 가정하십시오 ~/svnrepo.

  1. cd~/svnrepo/hooks
  2. 있는가 pre-revprop-change또는 pre-revprop-change.bat스크립트는? 그렇다면 변경하려고하면 중단되는 부분을 일시적으로 주석 처리하십시오 svn:log.
  3. 그렇지 않으면 Windows에서이라는 빈 파일을 작성하십시오 pre-revprop-change.bat. 이를 수행하는 한 가지 방법이 있습니다.

    copy con pre-revprop-change.bat
    ^Z
    
  4. 그렇지 않으면 Unix에서 다음을 실행하십시오.

    echo '#!/bin/sh' > pre-revprop-change
    chmod +x pre-revprop-change
    
  5. 작업중인 사본에서 svn propedit -r N --revprop svn:log다시 실행 하십시오.

  6. ~/svnrepo/hooks/svn-revprop-change( .bat)에 대한 변경 사항을 취소하십시오.

0

내가 서버 측의 좋은 구현이 svnforum에서 후크-REV-소품 - 변경 사전 발견 https://www.svnforum.org/forum/opensource-subversion-forums/scripts-contributions/8571-pre-revprop-change -쉘 스크립트 스크립트 허용 커미터-변경 시간-x 시간 이내

구현

  • 사용자 확인, 즉 자체 커밋 메시지 만 편집 할 수 있습니다.
  • SVN 관리자 재정의; 관리자는 무엇이든 편집 할 수 있습니다.
  • 타임 스탬프 비교 : 특정 시간보다 작은 커밋 만 편집 할 수 있습니다.

거기에서 가져 와서 마음대로 편집하십시오. 나는 원저자가 아니기 때문에 여기에 복사하지 않고 그것을 할 수있는 저작권 표시가 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.