Git มี "โหมดปลอดภัย" เพื่อป้องกันการเขียนประวัติใหม่หรือไม่?


11

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

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

  • commit --amend เมื่อ HEAD ถูกผลักไปแล้ว
  • rebase ของสาขาที่ไม่ใช่ในท้องถิ่น
  • reset ของสาขาที่ถูกผลัก

เหล่านี้เป็นตัวอย่างของสถานการณ์ที่อาจทำให้เกิดความpushล้มเหลวครั้งต่อไป(เพราะจะไม่ส่งต่ออย่างรวดเร็ว IIRC) ฉันทำสิ่งนั้นโดยบังเอิญและต้องสร้างสาขาขึ้นใหม่จากระยะไกล และฉันก็ยังโชคดีที่ทำสิ่งนี้เร็วพอจนไม่มีใครดึงประวัติที่ฉันเขียนใหม่

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

หากไม่มีคุณคิดว่ามันคุ้มค่าที่จะลองสร้างมันหรือไม่? คุณจะพยายามกำหนดวิธีการระบุ "การเปลี่ยนแปลงที่เป็นอันตราย" อย่างแม่นยำหรือไม่?


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

ดูเหมือนว่าสมเหตุสมผลคุณสามารถตรวจจับสิ่งนี้ในตะขอบนเครื่องระยะไกลแล้วปฏิเสธการเปลี่ยนแปลง
Andrew T Finnell


ฉันไม่ได้รับคำถามของคุณ โหมดเริ่มต้นนั้นปลอดภัย --forceมันจะไม่ช่วยให้คุณสามารถที่จะผลักดันเว้นแต่คุณจะระบุ
ŠimonTóth

ฉันต้องการเห็นบางสิ่งเช่นนี้ด้วย โดยทั่วไปฉันต้องการให้รุ่นการเรียนรู้ที่ปลอดภัยยิ่งขึ้นโดยใช้คำสั่งล้อมบรรทัดคำสั่งและเปิดเผยพื้นฐานเท่านั้น: กระทำ, ดึง, ดัน, ทำสิ่งที่ง่าย บังคับให้พวกเขาออกไปคอมไพล์อย่างเต็มที่เพื่ออะไรในหน้านี้: git-scm.com/book/en/Git-Tools-Rewriting-History Git ยากที่จะเรียนรู้กว่าเครื่องมืออื่น ๆ ที่มี repo ในท้องถิ่นและระยะไกลที่จะคิดเกี่ยวกับ - กังวลว่าคุณอาจทำการรีบูตแทนการย้อนกลับนั้นน่ากลัว
Chris Moschini

คำตอบ:


5

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

เพื่อสรุปผลคุณสามารถเปิดใช้งาน

git config --system receive.denyNonFastforwards true

และ

git config --system receive.denyDeletes true

หรือเขียนโพสต์รับเบ็ดเพื่อปฏิเสธสิ่งที่คุณกำหนดเป็นเขียนใหม่


1
ฉันเชื่อว่าdenyNonFastforwardsเป็นค่าเริ่มต้น (?) ในขณะที่denyDeletesไม่ใช่ สองสิ่งนี้มีประโยชน์ แต่ฉันจินตนาการว่าโซลูชันด้านไคลเอ็นต์ที่จะหยุดฉันจากการทำเช่นนั้นcommit --amendถ้าฉันไม่สามารถผลักดันมันได้ (เพราะ HEAD ถูกผลักไปแล้ว)
คอส

ในคำอื่น ๆ : นอกจากกลไกที่อนุญาตให้รักษาความสอดคล้องกันของระยะไกลแล้วฉันยังต้องการบางสิ่งบางอย่างที่ช่วยให้การรักษาความสอดคล้องของโคลนนิ่ง "สอดคล้อง" กับรีโมตด้วย
คอส

@Kos คุณสามารถสร้าง hooks ภายในได้เช่นกัน
Andrew T Finnell

มีวิธีการตั้งค่าdenyNonFastfowardsการtrueเฉพาะในสาขาหลัก? ฉันต้องการให้สาขาหัวข้อของฉันได้รับอนุญาตให้ถูกลดราคาและถูกบังคับ
nnyby

2

ไม่เพราะมันเป็นส่วนหนึ่งของปรัชญาของคอมไพล์ที่จะให้พลังเต็มที่แก่คุณและให้คุณจัดการพลังนั้นในแบบที่คุณต้องการ

หากคุณไม่ปฏิบัติตามปรัชญานี้บางทีการเปลี่ยนมาใช้ Mercurial จะคุ้มค่าเพราะพวกเขาอนุญาตให้เขียนประวัติใหม่ แต่มีข้อ จำกัด หรือชัดเจนชัดเจนลังเลที่ทำให้คุณรู้สึกว่าไม่ใช่ความคิดที่ดี


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

2

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

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