วิธีแก้ไขข้อความบันทึกการยืนยันในการโค่นล้มแล้ว?


550

มีวิธีแก้ไขข้อความบันทึกของการแก้ไขใน Subversion หรือไม่? ฉันตั้งใจเขียนชื่อไฟล์ผิดในข้อความส่งข้อความซึ่งอาจทำให้เกิดความสับสนในภายหลัง

ฉันเคยเห็นฉันจะแก้ไขข้อความคอมมิทที่ไม่ถูกต้องใน Git ได้อย่างไร แต่วิธีแก้ปัญหาสำหรับคำถามนั้นดูเหมือนจะไม่คล้ายกับการโค่นล้ม (ตามsvn help commit)


26
ฉันกำลังจะเลิกตอบคำถามนี้ แต่แล้วฉันก็รู้ว่าฉันได้ทำไปแล้ว 4 เดือนที่ผ่านมา :)
oksayt

6
หากเป็นรหัสให้แสดงความคิดเห็นและส่งความคิดเห็นที่เหมาะสมอีกครั้ง หากคุณเห็นด้วยกับความคิดเห็นของคุณที่สะท้อนถึงข้อผิดพลาดมันเป็นความพยายามน้อยกว่าและเร็วกว่ามาก ถ้าไม่ใช่คำตอบของ Kamil Kisiel จะเห็นได้ชัดว่าเป็นวิธีที่ถูกต้อง
marty

มีpre-revprop-changeสคริปต์ที่ยอดเยี่ยมที่ช่วยให้ผู้ใช้ที่ทำหน้าที่แก้ไขบันทึกได้นานถึง 3 ชั่วโมงหลังจากการคอมมิท นี่คือการประนีประนอมที่ยอดเยี่ยมระหว่างความยืดหยุ่น / การบันทึกที่ถูกต้องและการรักษาความน่าเชื่อถือ
jwa

หากคุณไม่สามารถเปลี่ยนไฟล์ได้ แต่ยังต้องการเพิ่มข้อความยืนยันใหม่คุณสามารถทำได้svn propset dummyproperty 1 yourfile; svn commit yourfile -m yourmessage
mulllhausen

คำตอบ:


457

โดยพื้นฐานแล้วคุณต้องมีสิทธิ์ของผู้ดูแลระบบ (โดยตรงหรือโดยอ้อม) ไปยังที่เก็บเพื่อทำสิ่งนี้ คุณสามารถกำหนดค่าที่เก็บเพื่ออนุญาตให้ผู้ใช้ทุกคนทำสิ่งนี้หรือคุณสามารถปรับเปลี่ยนข้อความบันทึกโดยตรงบนเซิร์ฟเวอร์

ดู ส่วนนี้ของคำถามที่พบบ่อยการโค่นล้ม (เหมืองที่เน้น):

ข้อความบันทึกจะถูกเก็บไว้ในที่เก็บเป็นคุณสมบัติที่แนบมากับการแก้ไขแต่ละครั้ง โดยค่าเริ่มต้นคุณสมบัติข้อความเข้าสู่ระบบ (SVN: log) ไม่สามารถแก้ไขได้เมื่อมันมีความมุ่งมั่น นั่นเป็นเพราะการเปลี่ยนแปลงคุณสมบัติการแก้ไข (ซึ่ง svn: log เป็นหนึ่ง) ทำให้ค่าก่อนหน้าของคุณสมบัติถูกยกเลิกอย่างถาวรและการโค่นล้มจะพยายามป้องกันไม่ให้คุณทำสิ่งนี้โดยไม่ตั้งใจ อย่างไรก็ตามมีสองวิธีในการทำให้การโค่นล้มเพื่อเปลี่ยนคุณสมบัติการแก้ไข

วิธีแรกสำหรับผู้ดูแลระบบพื้นที่เก็บข้อมูลเพื่อเปิดใช้งานการแก้ไขคุณสมบัติการแก้ไข สิ่งนี้ทำได้โดยการสร้าง hook ที่เรียกว่า "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 เป็นไฟล์ที่มีข้อความบันทึกใหม่ หาก hook "pre-revprop-change" ไม่ได้อยู่ในตำแหน่ง (หรือคุณต้องการข้ามสคริปต์ hook ด้วยเหตุผลบางประการ) คุณยังสามารถใช้ตัวเลือก --bypass-hooks อย่างไรก็ตามหากคุณตัดสินใจที่จะใช้ตัวเลือกนี้โปรดใช้ความระมัดระวัง คุณอาจเลี่ยงผ่านสิ่งต่าง ๆ เช่นการแจ้งเตือนทางอีเมลเกี่ยวกับการเปลี่ยนแปลงหรือระบบสำรองข้อมูลที่ติดตามคุณสมบัติการแก้ไข


15
ตั้งแต่วันที่ 3 กุมภาพันธ์ 2010 URL คือsubversion.apache.org/faq.html#change-log-msg
GreenMatt

1
นี่คือการดำเนินการขั้นพื้นฐานสำหรับตัวเลือก svnadmin svn-change-commit
albfan

2
ขอบคุณ! ยังคงมีประโยชน์ 6.5 ปีหลังจากคำตอบ :-)
ไมเคิล

วิธี propedit ทำงานมากหรือน้อย อย่างไรก็ตามฉันไม่สามารถรับการเปลี่ยนแปลงบันทึกเพื่อสะท้อนในเบราว์เซอร์ repo ฉันเห็นเฉพาะบันทึกการปรับปรุงในบรรทัดคำสั่ง svn ใน Windows ฉันต้องรีเฟรชแคชบันทึกเป็นขั้นตอนสุดท้าย: stackoverflow.com/questions/25750249/…
user_007

89

เมื่อคุณเรียกใช้คำสั่งนี้

svn propedit svn:log --revprop -r NNN 

และในกรณีที่คุณเห็นข้อความนี้:

คำขอ DAV ล้มเหลว เป็นไปได้ว่า hook pre-revprop-change ของที่เก็บอาจล้มเหลวหรือไม่มีอยู่จริง

มันเป็นเพราะการโค่นล้มไม่อนุญาตให้คุณแก้ไขข้อความบันทึกเพราะมันไม่ได้ถูกทำลายและจะหายไปอย่างถาวร

SVN ที่โฮสต์โดย Unix

ไปที่ไดเร็กทอรี hooks บนเซิร์ฟเวอร์ Subversion ของคุณ (แทนที่ ~ / svn / reponame ด้วยไดเรกทอรีของที่เก็บของคุณ)

cd ~/svn/reponame/hooks

ลบนามสกุล

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

ทำให้สามารถเรียกใช้งานได้ (ไม่สามารถทำ chmod + x!)

chmod 755 pre-revprop-change

แหล่ง

SVN ที่โฮสต์โดย Windows

ไม่สามารถใช้ไฟล์เท็มเพลตในไดเร็กทอรี hooks เนื่องจากเป็นแบบ Unix-specific คุณต้องคัดลอกไฟล์ชุดของ Windows pre-revprop-change.batไปยังไดเรกทอรีตะขอเช่นหนึ่งที่ให้ไว้ที่นี่


1
ทำไมคุณเขียนในวงเล็บ " ไม่สามารถทำ chmod + x!"?
อัครสาวก

1
ฉันได้สร้างสคริปต์ขนาดเล็กที่ใช้ความคิดเดียวกันที่นี่blog.mmonem.com/enable-changing-svn-log
mmonem

SVN_EDITOR, VISUAL หรือ EDITOR จำเป็นที่จะต้องมีการตั้งค่าก่อนการใช้งาน SVN propedit
Gerd

48

นี่คือรูปแบบที่มีประโยชน์ที่ฉันไม่เห็นพูดถึงในคำถามที่พบบ่อย คุณสามารถส่งคืนข้อความปัจจุบันเพื่อแก้ไขได้โดยระบุโปรแกรมแก้ไขข้อความ

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

17
มันต้องการให้มีการสร้าง hook ซึ่งจำเป็นต้องมีสิทธิ์ของผู้ดูแลระบบ 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 Code ดังนั้นฉันไม่คิดว่าฉันจะทำแบบนี้ได้ แต่ขอบคุณ
Jeremy Ruten

4
สิ่งนี้ใช้ได้กับฉันเนื่องจากวิธี propedit ล้มเหลวด้วย "พื้นที่เก็บข้อมูลไม่ได้เปิดใช้งานเพื่อยอมรับการแก้ไขรุ่น" ขอบคุณ!
pfctdayelise

1
+1 เพื่อให้คำสั่งโดยตรง :-) apache.org หยุดทำงานในขณะนี้และฉันไม่สามารถติดตามลิงก์ที่ให้ ...
Rafa

คำตอบนี้สมควรได้รับคะแนนมากขึ้น! มันจะดีกว่าเพราะคุณไม่ต้องตั้งค่า hook เพื่อใช้งาน
Peri Hartman

1
ชนสำหรับคำตอบนี้ใช้งานได้โดยไม่ต้องติดตั้งตะขอ แต่ก็ไม่ได้เปลี่ยนการแก้ไข "วันที่ / เวลา" ในบันทึกแค่ข้อความซึ่งเป็นสิ่งที่ฉันหวังไว้
segFaultCoder

17

ฉันเพิ่งได้รับมอบหมายนี้ด้วยเช่นกัน

เราต้องการอนุญาตให้โปรแกรมเมอร์ของเราแก้ไขเฉพาะข้อความกระทำของตนเองและ จำกัด ว่าพวกเขาจะได้รับอนุญาตให้ทำได้นานแค่ไหน เราตัดสินใจว่าพวกเขาจะได้รับอนุญาตให้แก้ไขข้อความบันทึกใด ๆ ที่กระทำในวันนั้นเพื่อแก้ไขตัวพิมพ์ผิด ฯลฯ

หลังจากดูตัวอย่างอื่น ๆ ทางออนไลน์ที่ฉันแฮ็คข้อมูลนี้ด้วยกันเราอยู่ในสภาพแวดล้อมของหน้าต่างดังนั้นนี่คือเนื้อหาของเรา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) ในการตรวจสอบวันสุดท้ายif /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLDฉันต้องสลับไปใช้เครื่องหมายคำพูดคู่รอบตัวแปรสองตัว (คุณคงไม่เชื่อว่าจะต้องใช้เวลานานเท่าไหร่ในการคิดออก) มิฉะนั้นฉันจะได้สิ่งต่าง ๆ เช่น "== '02' ไม่คาดคิดในเวลานี้" (ในวันที่ 2 ของเดือน) แบทช์ฟูของฉันไม่แข็งแรงพอที่จะรู้ว่าทำไมถึงเกิดขึ้น แต่ในกรณีที่คนอื่นประสบปัญหาแปลก ๆ
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 เช่น eclipse คุณสามารถใช้วิธีนี้ได้ง่าย

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 ของที่เก็บอาจล้มเหลวหรือเป็นที่เก็บข้อมูลที่ไม่มีอยู่ไม่ได้เปิดใช้งานเพื่อยอมรับการแก้ไข revision ขอให้ผู้ดูแลระบบสร้าง hook pre-revprop-change" แต่อย่างที่ฉันบอก: นั่นคือการใช้ TortoiseSVN (ไม่ใช่ผู้ดูแลระบบ) ไม่ใช่ Eclipse บางที Eclipse อาจแฮ็กสิทธิ์ SVN เพื่อสร้าง hook นั้นฉันไม่รู้
Christian Severin

อาจจะใช่ ลองทำใน eclipse
mani_nz

@ChristianSeverin ฉันได้รับข้อความแสดงข้อผิดพลาดเดียวกันเมื่อใช้ Eclipse มันมาจากเซิร์ฟเวอร์ Subversion อย่างแน่นอน
GreenhouseVeg

10

หากที่เก็บของคุณเปิดใช้งานการตั้งค่าคุณสมบัติการแก้ไขผ่าน hook pre-revprop-change คุณสามารถเปลี่ยนข้อความบันทึกได้ง่ายขึ้นมาก

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

หรือใน TortoiseSVN, AnkhSVN และไคลเอนต์การโค่นล้มอื่น ๆ อีกมากมายโดยคลิกขวาที่รายการบันทึกแล้วคลิก 'เปลี่ยนข้อความบันทึก'


2
ใน Subclipse (Eclipse) เป็น "Set Commit Properties"
pfctdayelise

2

โค่นล้มคำถามที่พบบ่อยครอบคลุมนี้ แต่ใช้พวงของความสับสนแง่ undefined เหมือนREPOS_PATHโดยไม่ต้องให้ตัวอย่างที่เกิดขึ้นจริงใด ๆ

อาจต้องใช้เวลาสักครู่เพื่อให้มันทำงานได้ดังนั้นให้บันทึกข้อความคอมมิทที่ได้รับการอัพเดตไว้ในไฟล์ ไม่เหมือนกับsvn-commit.tmpโค่นล้มจะไม่รักษาการพิมพ์ของคุณหากมีปัญหาไฟล์

ในไดเรกทอรีทำงานของคุณให้เรียกใช้

svn propedit -r N --revprop svn:log

เพื่อแก้ไขข้อความคอมมิท ถ้าได้ผลดีมาก! แต่มันอาจจะไม่ได้เนื่องจากsvn:logคุณสมบัติการแก้ไขนั้นไม่มีการยกเลิกและการโค่นล้มโดยค่าเริ่มต้นจะทำให้คุณไม่สามารถเขียนทับได้โดยใช้hook hook pre-revprop-changeหรือข้อความแสดงข้อผิดพลาดที่คุณไม่มีตะขอดังกล่าว

ในการเปลี่ยน hooks คุณต้องเข้าสู่ระบบไฟล์ที่ใช้พื้นที่เก็บข้อมูล 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

ฉันพบการใช้งานที่ดีของ hook pre-rev-prop-change ด้านเซิร์ฟเวอร์ที่ svnforum: https://www.svnforum.org/forum/opensource-subversion-forums/scripts-contribution/8571-pre-revprop-change -shell-สคริปต์ช่วยให้-commiters ต่อการเปลี่ยนแปลงของตัวเองเข้าสู่ระบบภายใน-x-ชั่วโมง

มันดำเนินการ

  • การตรวจสอบผู้ใช้นั่นเป็นเพียงข้อความยืนยันของตัวเองเท่านั้นที่สามารถแก้ไขได้
  • ผู้ดูแลระบบ Svn จะแทนที่ ผู้ดูแลระบบสามารถแก้ไขอะไรก็ได้
  • การเปรียบเทียบการประทับเวลา: เฉพาะการยืนยันที่อายุน้อยกว่าเวลาที่กำหนดเท่านั้นที่สามารถแก้ไขได้

คว้าจากที่นั่นและแก้ไขได้ตามต้องการ ฉันไม่ควรคัดลอกที่นี่เนื่องจากฉันไม่ใช่ผู้เขียนดั้งเดิมและไม่มีประกาศลิขสิทธิ์ที่จะอนุญาตให้ฉันทำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.