คำเตือนเกี่ยวกับ“ ตัวแปร diff.renamelimit” เมื่อทำการ git push


87

ฉันกำลังผลักดันโลคัลคอมมิตไปยังเซิร์ฟเวอร์ git ระยะไกลและได้รับข้อความเตือนต่อไปนี้:

remote: warning: only found copies from modified paths due to too many files.
remote: warning: you may want to set your diff.renamelimit variable to at least 19824 and retry the command.

แต่จริงๆแล้วฉันได้ตั้งค่าความแตกต่างเรนาเมลมิตเป็น 0 แล้ว (ฉันคิดว่าศูนย์หมายถึงไม่ จำกัด ใช่ไหม)

$ git config --list
...
diff.renamelimit=0

แล้วฉันจะทำอย่างไรเพื่อหลีกเลี่ยงคำเตือนนี้? ขอบคุณ.

คำตอบ:


67

เอกสารไม่ได้พูดถึง 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.

82
git config merge.renameLimit 999999

อะไรmerge.renameLimitเฉลี่ย

จำนวนไฟล์ที่ต้องพิจารณาเมื่อทำการตรวจจับการเปลี่ยนชื่อระหว่างการผสาน หากไม่ได้ระบุค่าเริ่มต้นค่าของdiff.renameLimit

แหล่งที่มา: https://git-scm.com/docs/git-merge


35
เหตุผลนี้เป็นmerge.renameLimitแทนdiff.renameLimit?
pgpb.padilla

@ pgpb.padilla คล้ายกันมาก
Sandra K

4
git config diff.renameLimit 999999 (ใส่หมายเลขของคุณเอง) ทำงานให้ฉัน
elarcoiris

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

@ pgpb.padilla คำเตือนของฉันกล่าวว่าคำเตือน: คุณอาจต้องการตั้งค่าmerge.renamelimitตัวแปรของคุณเป็นอย่างน้อย 1659 และลองคำสั่งอีกครั้ง ดังนั้นgit config merge.renamelimit 10000น่าจะเป็นคำสั่งที่เหมาะสมสำหรับฉัน (ฉันตั้งวงเงิน 10000 ที่นี่) git config merge.renamelimitเมื่อคุณตั้งมันคุณสามารถอ่านกลับการตั้งค่าของคุณด้วย
Gabriel Staples
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.