Làm thế nào để git phát hiện các tệp tương tự, để phát hiện đổi tên của nó?


91

Wikipedia giải thích việc phát hiện đổi tên tự động:

Một cách ngắn gọn, cho một tệp trong bản sửa đổi N, một tệp cùng tên trong bản sửa đổi N-1 là tổ tiên mặc định của nó. Tuy nhiên, khi không có tệp có tên giống trong bản sửa đổi N-1, Git sẽ tìm kiếm một tệp chỉ tồn tại trong bản sửa đổi N-1 và rất giống với tệp mới.

Phát hiện đổi tên dường như kết thúc với phát hiện tệp tương tự. Thuật toán đó có được ghi lại ở bất cứ đâu không? Sẽ rất tuyệt nếu biết những loại biến đổi nào được phát hiện tự động.


Câu trả lời:


92

Git theo dõi nội dung tệp, không theo dõi tên tệp. Vì vậy, việc đổi tên tệp mà không thay đổi nội dung của nó rất dễ dàng để git phát hiện. (Git không theo dõi, nhưng thực hiện phát hiện ; sử dụng git mvhoặc git rmgit addhiệu quả là như nhau.)

Khi một tệp được thêm vào kho lưu trữ, tên tệp sẽ nằm trong đối tượng cây. Nội dung tệp thực tế được thêm vào dưới dạng một đối tượng lớn nhị phân ( blob ) trong kho lưu trữ. Git sẽ không thêm một blob khác cho các tệp bổ sung có cùng nội dung. Trên thực tế, Git không thể vì nội dung được lưu trữ trong hệ thống tệp với hai ký tự đầu tiên của băm là tên thư mục và phần còn lại là tên tệp bên trong nó. Vì vậy, để phát hiện đổi tên là một vấn đề so sánh các băm.

Để phát hiện những thay đổi nhỏ đối với tệp đã đổi tên, Git sử dụng một số thuật toán nhất định và giới hạn ngưỡng để xem đây có phải là đổi tên hay không. Ví dụ, hãy xem -Mlá cờ cho git diff. Ngoài ra còn có các giá trị cấu hình như merge.renameLimit(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).

Để hiểu cách git xử lý các tệp tương tự (tức là những biến đổi tệp nào được coi là đổi tên), hãy khám phá các tùy chọn cấu hình và cờ có sẵn, như đã đề cập ở trên. Bạn không cần phải xem xét với cách làm. Để hiểu cách git thực sự hoàn thành các nhiệm vụ này, hãy xem các thuật toán để tìm sự khác biệt trong văn bản và đọc mã nguồn git.

Các thuật toán chỉ được áp dụng cho các mục đích khác biệt, hợp nhất và ghi nhật ký - chúng không ảnh hưởng đến cách git lưu trữ chúng. Bất kỳ thay đổi nhỏ nào trong nội dung tệp có nghĩa là một đối tượng mới được thêm vào cho nó. Không có delta hoặc khác biệt xảy ra ở cấp độ đó. Tất nhiên, sau này, các đối tượng có thể được đóng gói trong đó các delta được lưu trữ trong các gói dữ liệu, nhưng điều đó không liên quan đến việc phát hiện đổi tên.


57
"Bạn không cần phải được xem xét với như thế nào." - Tôi nghĩ đó là câu hỏi?
bain

2

Có nhiều thuật toán phát hiện sự tương đồng giữa các văn bản và hệ thống kiểm soát phiên bản thường sử dụng những thuật toán này để chỉ lưu trữ sự khác biệt giữa hai phiên bản. Các công cụ như WinMerge đủ thông minh để phát hiện sự khác biệt, ngay cả trong các dòng, vì vậy tôi không thấy lý do tại sao các thuật toán này không được sử dụng để phát hiện đổi tên này.

Đây là một cuộc thảo luận về các thuật toán để phát hiện các văn bản tương tự . Một số thuật toán này có thể được tối ưu hóa cho các ngôn ngữ tự nhiên, trong khi những thuật toán khác có thể hoạt động tốt hơn cho mã nguồn, nhưng về bản chất thì chúng rất giống nhau.

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.