ทำไมฉันไม่สามารถแก้ไขข้อความยืนยัน SVN ได้?


12

ฉันใช้ SVN บางครั้งฉันคิดถึงบางอย่างเมื่อฉันเขียนข้อความยืนยัน แต่เมื่อมีการยืนยันแล้วจะไม่สามารถเปลี่ยนกลับได้และฉันไม่สามารถแก้ไขข้อความได้ ทำไมพวกเขาถึงไม่ใส่ฟังก์ชั่นแก้ไขเข้าไป?


7
เตือนฉันถึงเรื่องราวของDave.cppเมื่อ thedailtywtf
Falcon

1
เพียงแค่ใช้คอมไพล์มันอนุญาตให้รวมคอมมิตแก้ไขข้อความและทำสิ่งอื่นที่คุณชอบด้วยประวัติของคุณ
SK-logic

หรือถ้าคุณไม่สามารถใช้งานได้git-svnและไม่มีใครจะฉลาด
Matthew Scharley

@ Matthew: วิธีบนโลกด้วย git-svn ช่วยให้คุณสามารถเปลี่ยนประวัติใน svn repo แก้ไขประวัติศาสตร์ปิดการใช้งาน?
gbjbaanb

2
@gbjbaanb: ไม่เป็นไรถ้าคุณได้ผลักดันเซิร์ฟเวอร์ SVN ไปแล้ว แต่ถ้าคุณได้รับมอบหมายจากท้องถิ่นเท่านั้นคุณยังสามารถเปลี่ยนข้อความยืนยันได้ก่อนที่จะส่งไปยัง repo สด
Matthew Scharley

คำตอบ:


15

ตามที่ SVN คำถามที่พบบ่อย, คุณสามารถถ้าผู้ดูแลระบบที่เก็บได้เปิดใช้งานหรือถ้าคุณมีการเข้าถึงการบริหารท้องถิ่นในการเก็บข้อมูล

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


4
@ แมทธิวแม้ในคอมไพล์การเปลี่ยนแปลงประวัติศาสตร์ ณ จุดใดก็ตามในความคิดของฉันเป็นความคิดที่น่ากลัว ประวัติศาสตร์ควรจะทำหน้าที่เป็นหลักฐานการตรวจสอบและไม่ควรมีการเปลี่ยนแปลงโดยทุกคนที่จุดใดก็ตามด้วยเหตุผลใดก็ตาม
โธมัสโอเวนส์

2
ดังนั้นมีหลักฐานการตรวจสอบสำหรับข้อความยืนยันเนื่องจากโดยปกติแล้ววัตถุประสงค์ของการเปลี่ยนแปลงข้อความส่งข้อความคือเพื่อให้ง่ายต่อการติดตามประวัติของโครงการ
Peter Taylor

2
สมมติว่าฉันค้นพบว่ากระทำข้อความที่ผมเข้าเดือนที่ผ่านมาเป็นความเข้าใจผิดทำให้เกิดความสับสนและจริงจังที่ไม่ถูกต้อง ฉันควรจะเพิ่มเครื่องหมายการแก้ไขที่ทุกคนที่เห็นข้อความไม่ถูกต้องหรือไม่ (ฉันยอมรับข้อความต้นฉบับควรไม่สามารถแก้ไขได้โดยง่ายและการเปลี่ยนแปลงนั้นควรถูกติดตามและประทับเวลา แต่ฉันไม่เห็นด้วยว่าสิ่งนี้ถือเป็น "ประวัติการเปลี่ยนแปลง")
David Schwartz

2
ข้อมูลที่ไม่ถูกต้องเป็นที่ยอมรับไม่ได้ดังนั้นผู้คนจะต้องไม่ได้รับอนุญาตให้แก้ไขหรือชี้แจงข้อมูลดังกล่าวเนื่องจากจะซ่อนความผิดพลาดของตนเอง ว้าว. แค่ว้าว
David Schwartz

3
คุณจะเริ่มดูเหมือนล้อเลียนตัวเองอย่างสุจริต "จะต้องมีการแก้ไขดังนั้นจึงต้องไม่ถูกแก้ไข"
David Schwartz

5

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

ตรวจสอบคำถามที่พบบ่อยของ SVN ที่นี่

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

คำตอบจากKamil Kisielในการตอบสนองต่อคำถามที่คล้ายกันในกองมากเกิน


เมื่อคุณคัดลอกวางคำตอบจาก stackoverflow อย่างน้อยคุณควรทำเครื่องหมายเป็นคำพูดและให้เครดิตแก่ OP (Kamil Kisiel ในกรณีนี้) ลิงก์ไปที่ต้นฉบับ: stackoverflow.com/questions/304383/…โปรดแก้ไขคำตอบของคุณหรือฉันจะลงคะแนนให้คุณ
เหยี่ยว

4

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

ระบบควบคุมเวอร์ชันแจกจ่ายเช่น Git ช่วยลดปัญหานี้โดยการทำให้แน่ใจว่าการให้ข้อมูลแก่ผู้อื่นนั้นเป็นเรื่องของอะตอมและไม่มีข้อมูลเพิ่มเติมใด ๆ เช่นการส่งข้อความ แต่ใช้หลักการเดียวกันนี้: คุณไม่อยากเปลี่ยนสิ่งต่าง ๆ ในท้องถิ่นที่คุณได้ทำให้คนอื่นเห็น


พวกเขาอาจทำให้หลายรุ่นกระทำข้อความ ...
อเล็กซ์ Feinman

1
@ l0b0 ไม่ได้เลวร้ายยิ่งกว่าที่จะเผยแพร่ข้อมูลที่เป็นเท็จทำให้เข้าใจผิดหรือมีแนวโน้มที่จะทำความเสียหายต่อไป การเก็บบันทึกไม่จำเป็นต้องมีข้อมูลที่ไม่ดี
user179700

1
@ user179700: ถูกต้อง มีข้อสันนิษฐานการออกแบบที่มีข้อบกพร่องพื้นฐานใน VCSes ทั้งหมดที่ฉันเคยเห็น: การกระทำมีข้อความยืนยันหนึ่งข้อความซึ่งไม่เปลี่ยนรูป อเล็กซ์กล่าวว่าเราควร "อนุญาตข้อความยืนยันหลายเวอร์ชัน"
l0b0

@ l0b0 ฉันพบว่าคำถามนี้น่าสนใจยิ่งฉันพิจารณามากกว่านี้ ปฏิกิริยาแรกของฉันอยู่ในแนวของเพียงเขียนอย่างระมัดระวังมากขึ้น การปฏิบัติในปัจจุบันดูเหมือนว่าจะเอ็นร้อยหวายกระบวนการ ฉันก็สงสัยเช่นกันว่าระบบอื่นใดที่ใช้การปฏิบัติที่แข็งแกร่งกว่านี้ ถึงเวลาสำหรับคำถามอื่น ๆ +1
user179700

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