git ตรวจหาไฟล์ที่คล้ายกันได้อย่างไรสำหรับการตรวจจับการเปลี่ยนชื่อ


92

Wikipedia อธิบายการตรวจจับการเปลี่ยนชื่ออัตโนมัติ:

โดยย่อให้ไฟล์ในการแก้ไข N ไฟล์ที่มีชื่อเดียวกันในการแก้ไข N − 1 คือบรรพบุรุษเริ่มต้น อย่างไรก็ตามเมื่อไม่มีไฟล์ที่มีชื่อเหมือนกันในการแก้ไข N − 1 Git จะค้นหาไฟล์ที่มีอยู่ในการแก้ไข N − 1 เท่านั้นและคล้ายกับไฟล์ใหม่มาก

เห็นได้ชัดว่าการเปลี่ยนชื่อการตรวจจับจะทำให้การตรวจจับไฟล์คล้ายกัน อัลกอริทึมนั้นได้รับการบันทึกไว้ที่ใดหรือไม่? คงจะดีไม่น้อยหากทราบว่าการเปลี่ยนแปลงประเภทใดที่ตรวจพบโดยอัตโนมัติ


ดูเพิ่มเติมที่: stackoverflow.com/questions/13805750/…
Trilarion

คำตอบ:


93

Git ติดตามเนื้อหาไฟล์ไม่ใช่ชื่อไฟล์ ดังนั้นการเปลี่ยนชื่อไฟล์โดยไม่เปลี่ยนเนื้อหาจึงเป็นเรื่องง่ายสำหรับการตรวจจับคอมไพล์ (Git ไม่ได้ติดตาม แต่ทำการตรวจจับโดยใช้git mvหรือgit rmและgit addมีประสิทธิภาพเหมือนกัน)

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

ในการตรวจจับการเปลี่ยนแปลงเล็กน้อยของไฟล์ที่เปลี่ยนชื่อ Git จะใช้อัลกอริทึมบางอย่างและขีด จำกัด ขีด จำกัด เพื่อดูว่านี่เป็นการเปลี่ยนชื่อหรือไม่ ตัวอย่างเช่นมีลักษณะที่เป็นธง-M git diffนอกจากนี้ยังมีค่าคอนฟิกูเรชันเช่นmerge.renameLimit(จำนวนไฟล์ที่ต้องพิจารณาเมื่อทำการตรวจหาการเปลี่ยนชื่อระหว่างการผสาน)

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

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


59
"คุณไม่จำเป็นต้องพิจารณาด้วยวิธีการ" - ฉันคิดว่านั่นคือคำถาม?
bain

2

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

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

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