Subversion에서 이미 커밋 된 로그 메시지를 편집하는 방법은 무엇입니까?
Subversion에서 특정 개정의 로그 메시지를 편집하는 방법이 있습니까? 커밋 메시지에 실수로 잘못된 파일 이름을 작성하여 나중에 혼란 스러울 수 있습니다.
나는 본 적이 내가 잘못된 힘내에서 커밋 메시지를 수정하려면 어떻게합니까? 그러나 그 질문에 대한 해결책은 Subversion과 비슷하지 않습니다 (에 따르면 svn help commit
).
이를 위해서는 저장소에 대한 관리자 권한 (직접 또는 간접)이 있어야합니다. 모든 사용자가이를 수행 할 수 있도록 저장소를 구성하거나 서버에서 직접 로그 메시지를 수정할 수 있습니다.
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 옵션을 사용할 수도 있습니다. 그러나이 옵션을 사용하기로 결정한 경우 매우주의하십시오. 변경 사항에 대한 이메일 알림 또는 수정 사항 특성을 추적하는 백업 시스템과 같은 것을 생략 할 수 있습니다.
이 명령을 실행하면
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 제공) 에 복사해야합니다 .
FAQ에서 언급하지 않은 편리한 변형이 있습니다. 텍스트 편집기를 지정하여 편집 할 현재 메시지를 반환 할 수 있습니다.
svn propedit svn:log --revprop -r N --editor-cmd vim
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt
나는 최근에 이것도 맡았다.
우리는 프로그래머가 자신의 커밋 메시지 만 수정하고 얼마나 멀리 되돌릴 수 있는지 제한하고 싶었습니다. 그날 커밋 된 로그 메시지를 수정하고 오타 등을 수정하도록 허용하기로 결정했습니다.
온라인으로 몇 가지 다른 예제를 본 후 함께 해킹했습니다. 우리는 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
편집 : 이것에 대한 독창적 인 아이디어는 이 스레드 에서 나왔습니다 .
Windows에서 Tortoise SVN 클라이언트 사용 :
- 프로젝트 폴더를 마우스 오른쪽 버튼으로 클릭하고 "로그 표시"를 선택하십시오.
- 로그 메시지 창에서 수정본을 마우스 오른쪽 단추로 클릭하고 "로그 메시지 편집"을 선택하십시오.
작동하지 않으면 서버의 SVN 설정 방법으로 인해 다른 응답을 읽으십시오.
이클립스와 같은 IDE를 사용하는 경우이 쉬운 방법을 사용할 수 있습니다.
Right click on the project -> Team - Show history
그 안에 right click on the revision id for your commit and select 'Set commit properties'
.
여기에서 원하는대로 메시지를 수정할 수 있습니다.
리포지토리에서 pre-revprop-change 후크를 통해 수정 속성을 설정할 수 있으면 로그 메시지를 훨씬 쉽게 변경할 수 있습니다.
svn propedit --revprop -r 1234 svn:log url://to/repository
또는 TortoiseSVN, AnkhSVN 및 기타 많은 하위 버전 클라이언트에서 로그 항목을 마우스 오른쪽 버튼으로 클릭 한 다음 '로그 메시지 변경'을 클릭하십시오.
서브 자주 묻는 질문 이 포함하지만, 같은 정의되지 않은 용어를 혼동 한 무리의 사용 REPOS_PATH
실제 예제를 제공하지 않고 있습니다.
작동하려면 몇 번의 시도가 필요할 수 있으므로 업데이트 된 커밋 메시지를 파일에 저장하십시오. svn-commit.tmp
파일 과 달리 Subversion은 문제가있을 경우 입력 내용을 보존하지 않습니다.
작업 디렉토리에서 다음을 실행하십시오.
svn propedit -r N --revprop svn:log
커밋 메시지를 편집합니다. 그것이 효과가 있다면, 훌륭합니다! 그러나 svn:log
revition 속성이 버전 화 되지 않고 Subversion은 기본적으로 후크 스크립트 pre-revprop-change
또는 후크 가없는 오류 메시지를 사용하여 덮어 쓰지 못하게 하기 때문에 아마 그렇지 않을 것입니다.
후크를 변경하려면 리포지토리가 호스팅되는 파일 시스템에 액세스해야합니다. svn info
리포지토리 루트를 알려줍니다. 이라고 가정하십시오 ~/svnrepo
.
cd
에~/svnrepo/hooks
- 있는가
pre-revprop-change
또는pre-revprop-change.bat
스크립트는? 그렇다면 변경하려고하면 중단되는 부분을 일시적으로 주석 처리하십시오svn:log
. 그렇지 않으면 Windows에서이라는 빈 파일을 작성하십시오
pre-revprop-change.bat
. 이를 수행하는 한 가지 방법이 있습니다.copy con pre-revprop-change.bat ^Z
그렇지 않으면 Unix에서 다음을 실행하십시오.
echo '#!/bin/sh' > pre-revprop-change chmod +x pre-revprop-change
작업 사본에서
svn propedit -r N --revprop svn:log
다시 실행 하십시오.~/svnrepo/hooks/svn-revprop-change
(.bat
)에 대한 변경 사항을 취소하십시오.
참고 URL : https://stackoverflow.com/questions/304383/how-to-edit-log-message-already-committed-in-subversion
'Programing' 카테고리의 다른 글
프로그래밍 방식으로 기본 UIButton을 작성하는 방법 (0) | 2020.02.10 |
---|---|
Chrome DevTools의 요소에서 발생한 이벤트를 보려면 어떻게합니까? (0) | 2020.02.10 |
이클립스 : 자동 서식의 최대 줄 길이를 설정 하시겠습니까? (0) | 2020.02.10 |
MVC에서 모델을 어떻게 구성해야합니까? (0) | 2020.02.10 |
수정 방법 : 처리기“PageHandlerFactory-Integrated”의 모듈 목록에“ManagedPipelineHandler”모듈이 잘못되었습니다 (0) | 2020.02.10 |