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 log
hoặ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ị renameLimit
nà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 stdout
trướ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.
merge.renameLimit
thay vìdiff.renameLimit
?