เอกสารไม่ได้พูดถึง 0 diff.renamelimit
เป็นค่าพิเศษ
ดังนั้นคุณควรตั้งค่าขีด จำกัด นั้นเป็นค่าที่แนะนำ
หรือคุณสามารถลองปิดการใช้งานการตรวจจับการเปลี่ยนชื่อทั้งหมด ( git config diff.renames 0
)
คุณจะพบตัวอย่างที่คล้ายกันนี้ในบล็อกโพสต์ " Confluence, git, rename, merge oh my ... ":
ดังกล่าวแล้วคอมไพล์พยายามที่จะตรวจสอบการเปลี่ยนชื่อไฟล์ตามความเป็นจริงว่าตัวอย่างเช่นเมื่อใช้หรือgit log
เมื่อพยายามตรวจจับ git การเปลี่ยนชื่อจะแยกความแตกต่างระหว่างการเปลี่ยนชื่อที่แน่นอนและไม่ตรงกับการเปลี่ยนชื่อเดิมโดยไม่เปลี่ยนเนื้อหาของไฟล์และการเปลี่ยนชื่อในภายหลังซึ่งอาจรวมถึงการเปลี่ยนแปลงเนื้อหาของไฟล์ (เช่นการเปลี่ยนชื่อ / ย้ายคลาส Java)
ความแตกต่างนี้มีความสำคัญเนื่องจากอัลกอริทึมในการตรวจจับการเปลี่ยนชื่อที่แน่นอนเป็นเชิงเส้นและจะดำเนินการเสมอในขณะที่อัลกอริทึมสำหรับการตรวจจับการเปลี่ยนชื่อที่ไม่แน่นอนเป็นกำลังสอง ( ) และ git จะไม่พยายามทำเช่นนี้หากจำนวนไฟล์ที่เปลี่ยนแปลงเกินเกณฑ์ที่กำหนด (1,000 โดย ค่าเริ่มต้น).git diff/merge
O(n^2)
เนื่องจากจำนวนไฟล์ที่ได้รับผลกระทบจากการจัดโครงสร้างใหม่ล่าสุดเกินเกณฑ์นี้ git จึงยอมแพ้และปล่อยให้ความละเอียดในการผสานขึ้นอยู่กับผู้พัฒนา ในกรณีของเราเราสามารถหลีกเลี่ยงการแก้ไขปัญหาการผสานด้วยตนเองได้โดยการเปลี่ยนเกณฑ์
หมายเหตุ: Git 2.16 (Q1 2018) จะแก้ไขขีด จำกัด ดังกล่าว:
ในอดีตเครื่องจักรที่แตกต่างสำหรับการตรวจจับการเปลี่ยนชื่อมีขีด จำกัด แบบฮาร์ดโค้ดที่ 32k พา ธ ; สิ่งนี้กำลังถูกยกขึ้นเพื่อให้ผู้ใช้สามารถแลกเปลี่ยนวัฏจักรด้วย (อาจ) อ่านผลได้ง่ายขึ้น
ดูกระทำ 8997355 (29 พฤศจิกายน 2017) โดยโจนาธานตาล (jhowtan
)
ดูกระทำ 9268cf4 , กระทำ 9f7e4bf , กระทำ d6861d0 , กระทำ b520abf (13 พฤศจิกายน 2017) โดยเอลียาห์ Newren (newren
)
(รวมโดยJunio C Hamano - gitster
-ในการกระทำ 6466854 , 19 ธันวาคม 2017)
diff
: ถอดแคลมป์เงียบของ renameLimit
ในการกระทำ 0024a54 (แก้ไขการตรวจสอบขีด จำกัด การตรวจจับการเปลี่ยนชื่อกันยายน 2550 Git v1.5.3.2) renameLimit
ถูก จำกัด ไว้ที่ 32767
สิ่งนี้ดูเหมือนจะเป็นเพียงการหลีกเลี่ยงการล้นจำนวนเต็มในการคำนวณต่อไปนี้:
num_create * num_src <= rename_limit * rename_limit
แม้ว่าจะถูกมองว่าเป็นฮาร์ดโค้ดที่ผูกไว้กับระยะเวลาของ CPU แต่เรายินดีที่จะให้ผู้ใช้บอกให้ git ใช้จ่ายในการจัดการการเปลี่ยนชื่อ
ขอบเขตบนอาจสมเหตุสมผล แต่น่าเสียดายที่ขอบเขตบนนี้ไม่ได้รับการสื่อสารกับผู้ใช้หรือมีการบันทึกไว้ที่ใดก็ได้
แม้ว่าขีด จำกัด ขนาดใหญ่จะทำให้สิ่งต่างๆช้าลง แต่เรามีผู้ใช้ที่มีความสุขที่จะมีการเปลี่ยนแปลงไฟล์เล็ก ๆ ห้าไฟล์ได้อย่างถูกต้องแม้ว่าจะต้องระบุขีด จำกัด ขนาดใหญ่ด้วยตนเองและรอสิบนาทีเพื่อให้ตรวจพบการเปลี่ยนชื่อ
สคริปต์และเครื่องมือที่มีอยู่ซึ่งใช้ " -l0
" เพื่อทำงานต่อไปโดยถือว่า 0 เป็นค่าพิเศษที่บ่งชี้ว่าขีด จำกัด การเปลี่ยนชื่อต้องเป็นตัวเลขที่มาก
Git 2.17 (Q2 2018) จะหลีกเลี่ยงการแสดงข้อความเตือนกลางบรรทัดของgit diff
เอาต์พุต ""
ดูกระทำ 4e056c9 (16 มกราคม 2018) โดยNguyễnTháiNgọc Duy (pclouds
)
(รวมโดยJunio C Hamano - gitster
-ในการกระทำ 17c8e0b , 13 กุมภาพันธ์ 2018)
diff.c
: ล้างstdout
ก่อนพิมพ์คำเตือนเปลี่ยนชื่อ
เอาต์พุตที่แตกต่างถูกบัฟเฟอร์ในFILE
ออบเจ็กต์และยังสามารถบัฟเฟอร์ได้บางส่วนเมื่อเราพิมพ์คำเตือนเหล่านี้ (โดยตรงไปยังfd 2
)
ผลลัพธ์จะยุ่งเหยิงเช่นนี้
worktree.c | 138 +-
worktree.h warning: inexact rename detection was skipped due to too many files.
| 12 +-
wrapper.c | 83 +-
จะแย่ลงถ้าคำเตือนถูกพิมพ์หลังจากพิมพ์รหัสสีสำหรับส่วนกราฟแล้ว คุณจะได้รับคำเตือนเป็นสีเขียวหรือสีแดง
ล้าง stdout ก่อนเพื่อให้เราได้สิ่งนี้แทน:
xdiff/xutils.c | 42 +-
xdiff/xutils.h | 4 +-
1033 files changed, 150824 insertions(+), 69395 deletions(-)
warning: inexact rename detection was skipped due to too many files.
merge.renameLimit
แทนdiff.renameLimit
?