2011-06-28 27 views
5

Cách tốt nhất để xử lý các đổi tên lớp (ví dụ: thực hiện với Resharper) bằng Git là gì?Phát hiện đổi tên Git khi tên lớp và tên tệp thay đổi trong một cam kết

Tức là, nếu cả tên lớp và tên tệp chứa đều được thay đổi cùng nhau và cam kết mà không cần thay đổi thêm.

Dường như cách Git xử lý đổi tên thông qua phần trăm thay đổi heuristic là một chút hit và bỏ lỡ. Đối với các lớp học lớn, nó sẽ được công nhận là một sự đổi tên nhưng đối với các lớp nhỏ, tỷ lệ phần trăm đạt tới mức nó sẽ được xem như là xóa và thêm vào.

+1

Git không theo dõi đổi tên một cách rõ ràng. Nó được suy ra một cách nhanh chóng, do đó, không có cách nào để làm cho Git đối xử với một cái gì đó như đổi tên nếu nó không thể phát hiện ra nó. – hammar

Trả lời

6

Hãy nhớ rằng trong lịch sử của Git, đổi tên tệp là không được lưu dưới dạng "tên này đã được đổi tên từ X thành Y". Thay vào đó, tệp X tồn tại trong một bản sửa đổi và trong bản sửa đổi tiếp theo Y tồn tại (và X không). Ví dụ:

 
Revision | Files 
---------+---------------------------------- 
HEAD^ | a.cpp x.cpp    z.cpp 
HEAD  | a.cpp    y.cpp z.cpp 

Trong biểu đồ trên, mỗi sửa đổi là một hàng và mỗi tệp chứa ba tệp. Giữa hai phiên bản, x.cpp đã được đổi tên thành y.cpp. Thông tin duy nhất mà kho lưu trữ là nội dung của mỗi phiên bản riêng biệt.

Khi Git (hoặc công cụ khác đọc kho lưu trữ Git) xem lịch sử ở trên, nó nhận thấy rằng y.cpp là tệp mới trong HEAD. Sau đó, nó xem xét trước đó sửa đổi để xem liệu một tệp tương tự đã tồn tại hay chưa. Trong trường hợp đổi tên tập tin thẳng, sau đó có, một tập tin gọi là x.cpp với nội dung giống hệt nhau tồn tại trong bản sửa đổi trước đó (và không còn tồn tại trong bản sửa đổi hiện tại). Vì vậy, tệp mới được hiển thị dưới dạng tên đổi từ x.cpp thành y.cpp.

Trong trường hợp đổi tên và sửa đổi, Git sẽ xem xét các tệp của bản sửa đổi trước đó để xem một tệp có gần tệp mới (về nội dung của tệp) hay không. Nếu hầu hết các dòng đều giống nhau, thì Git sẽ hiển thị nó như một sự đổi tên, nhưng nếu có đủ dòng thay đổi so với các dòng không đổi, thì Git sẽ đơn giản nói nó giống như một tập tin mới.

Để trả lời câu hỏi của bạn, cách tốt nhất để xử lý các đổi tên lớp resharper là chỉ cần thực hiện và cam kết các tệp mới. Git lưu trữ các tệp cũ và mới trong kho lưu trữ của nó. Đổi tên phát hiện được xử lý sau đó, tại thời điểm bạn thực sự hỏi về lịch sử. Đây là lý do tại sao các lệnh như git log có các tùy chọn như --find-copies--find-copies-harder.

+0

Vì vậy, bạn đang nói, "bình luận ngay trước khi đổi tên, họ cam kết một lần nữa ngay sau khi đổi tên" –

+1

@Ian Ringrose: Không thực sự, không. Nếu bạn làm điều đó, bạn sẽ có một cam kết ở giữa, nơi trạng thái của dự án có thể không xây dựng đúng (vì mọi thứ có thể ở trạng thái được đổi tên một nửa). Thực hiện thay đổi, bao gồm đổi tên nếu cần và mã cam kết làm việc. –

Các vấn đề liên quan