ฉันใช้ SVN บางครั้งฉันคิดถึงบางอย่างเมื่อฉันเขียนข้อความยืนยัน แต่เมื่อมีการยืนยันแล้วจะไม่สามารถเปลี่ยนกลับได้และฉันไม่สามารถแก้ไขข้อความได้ ทำไมพวกเขาถึงไม่ใส่ฟังก์ชั่นแก้ไขเข้าไป?
git-svn
และไม่มีใครจะฉลาด
ฉันใช้ SVN บางครั้งฉันคิดถึงบางอย่างเมื่อฉันเขียนข้อความยืนยัน แต่เมื่อมีการยืนยันแล้วจะไม่สามารถเปลี่ยนกลับได้และฉันไม่สามารถแก้ไขข้อความได้ ทำไมพวกเขาถึงไม่ใส่ฟังก์ชั่นแก้ไขเข้าไป?
git-svn
และไม่มีใครจะฉลาด
คำตอบ:
ตามที่ SVN คำถามที่พบบ่อย, คุณสามารถถ้าผู้ดูแลระบบที่เก็บได้เปิดใช้งานหรือถ้าคุณมีการเข้าถึงการบริหารท้องถิ่นในการเก็บข้อมูล
อย่างไรก็ตามการทำเช่นนี้อาจเป็นความคิดที่ไม่ดี คุณกำลังเปลี่ยนประวัติศาสตร์ หนึ่งในประเด็นของการควบคุมเวอร์ชันคือการรักษาประวัติและหลักฐานการตรวจสอบสำหรับโครงการ การยอมให้มีการเปลี่ยนแปลงโดยพลการต่อประวัติศาสตร์ทำให้เส้นทางการตรวจสอบพ่ายแพ้ แต่ฉันขอแนะนำให้คุณทำการคอมมิทที่เล็กกว่าเขียนข้อความที่รัดกุม แต่ชัดแจ้งและปรับปรุงขั้นตอนการทำงานส่วนบุคคลของคุณเพื่อป้องกันข้อผิดพลาดเหล่านี้
โดยพื้นฐานแล้วคุณต้องมีสิทธิ์ผู้ดูแลระบบ (โดยตรงหรือโดยอ้อม) ไปยังที่เก็บข้อมูลเพื่อทำสิ่งนี้ คุณสามารถกำหนดค่าที่เก็บเพื่ออนุญาตให้ผู้ใช้ทุกคนทำสิ่งนี้หรือคุณสามารถปรับเปลี่ยนข้อความบันทึกโดยตรงบนเซิร์ฟเวอร์
ตรวจสอบคำถามที่พบบ่อยของ 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ในการตอบสนองต่อคำถามที่คล้ายกันในกองมากเกิน
เนื่องจากเป็นระบบควบคุมเวอร์ชันรวมศูนย์ - ทันทีที่คุณส่งการเปลี่ยนแปลง (และข้อความคอมมิชชันของคุณคือโดยการประชุมที่ผูกมัดคอมมิชชัน) ทุกคนที่มีสิทธิ์อ่านเพื่อเข้าถึงที่เก็บสามารถเห็นข้อมูลนั้นได้ มันเป็นความคิดที่ดีที่จะเปลี่ยนแปลงข้อมูลหลังจากที่เผยแพร่ไปแล้วเพราะผู้คนต่างก็มีความเห็นที่แตกต่างกันเกี่ยวกับ "ความจริง"
ระบบควบคุมเวอร์ชันแจกจ่ายเช่น Git ช่วยลดปัญหานี้โดยการทำให้แน่ใจว่าการให้ข้อมูลแก่ผู้อื่นนั้นเป็นเรื่องของอะตอมและไม่มีข้อมูลเพิ่มเติมใด ๆ เช่นการส่งข้อความ แต่ใช้หลักการเดียวกันนี้: คุณไม่อยากเปลี่ยนสิ่งต่าง ๆ ในท้องถิ่นที่คุณได้ทำให้คนอื่นเห็น