Cảnh báo về “biến diff.renamelimit” khi thực hiện git push


86

Tôi đang đẩy cam kết cục bộ đến máy chủ git từ xa và nhận được thông báo cảnh báo sau:

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.

Nhưng thực ra tôi đã đặt diff.renamelimit thành 0 (tôi nghĩ số 0 có nghĩa là không giới hạn, phải không?).

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

Vậy tôi phải làm gì để tránh cảnh báo này? Cảm ơn.

Câu trả lời:


67

Các tài liệu không đề cập đến 0 như một giá trị đặc biệt cho diff.renamelimit.
Vì vậy, bạn nên đặt giới hạn đó thành giá trị được khuyến nghị.
Hoặc bạn có thể thử hủy kích hoạt hoàn toàn tính năng phát hiện đổi tên. ( git config diff.renames 0)

Bạn sẽ tìm thấy một ví dụ tương tự trong bài đăng blog này " Hợp lưu, git, đổi tên, hợp nhất oh my ... ":

Như đã đề cập, git cố gắng phát hiện các lần đổi tên tệp sau thực tế đó, chẳng hạn như khi sử dụng git loghoặc git diff/merge.
Khi cố gắng phát hiện các đổi tên, git phân biệt giữa tên chính xác và không chính xác với tên cũ là đổi tên mà không thay đổi nội dung của tệp và tên đổi tên sau có thể bao gồm các thay đổi đối với nội dung của tệp (ví dụ: đổi tên / di chuyển Lớp Java).
Sự khác biệt này rất quan trọng vì thuật toán phát hiện tên chính xác là tuyến tính và sẽ luôn được thực thi trong khi thuật toán phát hiện đổi tên không chính xác là bậc hai ( O(n^2)) và git không cố gắng thực hiện điều này nếu số lượng tệp được thay đổi vượt quá một ngưỡng nhất định (1000 x mặc định).

Vì số lượng tệp bị ảnh hưởng bởi việc sắp xếp lại gần đây vượt quá ngưỡng này, git chỉ cần từ bỏ và để lại giải pháp hợp nhất cho nhà phát triển. Trong trường hợp của chúng tôi, chúng tôi có thể tránh thực hiện giải pháp hợp nhất thủ công bằng cách thay đổi ngưỡng


Lưu ý: Git 2.16 (Q1 2018) sẽ sửa đổi giới hạn đó:

Trước đây, máy khác để phát hiện đổi tên có giới hạn mã cứng là 32k đường dẫn; điều này đang được dỡ bỏ để cho phép người dùng chu kỳ giao dịch với kết quả (có thể) dễ đọc hơn.

Xem cam kết 8997355 (29 tháng 11 năm 2017) của Jonathan Tan ( jhowtan) .
Xem cam kết 9268cf4 , cam kết 9f7e4bf , cam kết d6861d0 , cam kết b520abf (13 tháng 11 năm 2017) bởi Elijah Newren ( newren) .
(Hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 6466854 , ngày 19 tháng 12 năm 2017)

diff: loại bỏ kẹp im lặng của renameLimit

Trong cam kết 0024a54 (Khắc phục việc kiểm tra giới hạn phát hiện đổi tên; tháng 9 năm 2007, Git v1.5.3.2), giá trị renameLimitnày được kẹp vào 32767.
Điều này dường như chỉ để tránh tràn số nguyên trong phép tính sau:

num_create * num_src <= rename_limit * rename_limit

Mặc dù nó cũng có thể được xem như là một ràng buộc được mã hóa cứng về lượng thời gian CPU, chúng tôi sẵn sàng cho phép người dùng yêu cầu git dành cho việc xử lý đổi tên.
Giới hạn trên có thể có ý nghĩa, nhưng không may là giới hạn trên này không được thông báo cho người dùng hoặc được ghi lại ở bất kỳ đâu.

Mặc dù các giới hạn lớn có thể khiến mọi thứ chậm lại, nhưng chúng tôi có những người dùng sẽ rất vui khi có một thay đổi nhỏ trong năm tệp được chọn chính xác ngay cả khi họ phải chỉ định giới hạn lớn theo cách thủ công và đợi mười phút để các tên được phát hiện.

Các tập lệnh và công cụ hiện có sử dụng " -l0" để tiếp tục hoạt động, coi 0 là một giá trị đặc biệt cho biết rằng giới hạn đổi tên là một số rất lớn.


Git 2.17 (Quý 2 năm 2018) sẽ tránh hiển thị thông báo cảnh báo ở giữa dòng git diffđầu ra "".

See commit 4e056c9 (16 Jan 2018) by Nguyễn Thái Ngọc Duy ( pclouds) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 17c8e0b , ngày 13 tháng 2 năm 2018)

diff.c: flush stdouttrước khi in cảnh báo đổi tên

Đầu ra khác biệt được lưu vào bộ đệm trong một FILEđối tượng và vẫn có thể được đệm một phần khi chúng tôi in các cảnh báo này (trực tiếp tới fd 2).
Đầu ra bị lộn xộn như thế này

 worktree.c                                   |   138 +-
 worktree.h        warning: inexact rename detection was skipped due to too many files.
                           |    12 +-
 wrapper.c                                    |    83 +-

Sẽ tệ hơn nếu cảnh báo được in sau khi mã màu cho phần biểu đồ đã được in. Bạn sẽ nhận được cảnh báo màu xanh lá cây hoặc màu đỏ.

Flush stdout trước tiên, vì vậy chúng tôi có thể nhận được một cái gì đó như sau:

 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.

79
git config merge.renameLimit 999999

Những gì hiện merge.renameLimit bình

Số lượng tệp cần xem xét khi thực hiện phát hiện đổi tên trong quá trình hợp nhất; nếu không được chỉ định, mặc định là giá trị của diff.renameLimit .

nguồn: https://git-scm.com/docs/git-merge


34
tại sao cái này merge.renameLimitthay vì diff.renameLimit?
pgpb.padilla

@ pgpb.padilla rất giống
Sandra K

4
git config diff.renameLimit 999999 (chèn số của riêng bạn) phù hợp với tôi.
elarcoiris

1
Có lý do gì khiến ai đó có thể không muốn tối đa hóa điều này không? Tại sao giới hạn tồn tại ngay từ đầu? Chỉ để cứu CPU của bạn khỏi các hợp nhất cực lớn?
electrovir
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.