2009-12-21 28 views
15

Tôi chỉ đọc git-blame trang hướng dẫn một lần nữa và nhận thấy phần này:Tôi có thể phát hiện mã sao chép và dán bằng cách sử dụng git như thế nào?

Một đặc biệt là cách hữu ích là để xem nếu một tập tin bổ sung có dòng tạo ra bằng cách sao chép và dán từ các tập tin hiện có. Đôi khi điều này cho thấy rằng nhà phát triển đã bị cẩu thả và không cấu trúc lại mã đúng cách. Trước tiên, bạn có thể tìm thấy những cam kết rằng đã giới thiệu tập tin với:

git log --diff lọc = A --pretty = ngắn - foo

và sau đó chú thích các thay đổi giữa các cam kết và cha mẹ của nó, sử dụng cam kết ^! ký hiệu:

git đổ lỗi -C -C -f $ commit ^! - foo

Điều này nghe có vẻ khá thú vị, nhưng tôi không hoàn toàn không biết cách hoạt động và lý do. Tôi tự hỏi liệu nó có thể được sử dụng trong một git hook để phát hiện copy mã số &. Có thể một số chuyên gia git có thể giải thích hiệu quả của việc sử dụng các lệnh git ở trên với nhau, và liệu có thể sử dụng một cái gì đó như vậy để làm cho git hiển thị cho dù sao chép mã (có thể bằng cách sử dụng 'chỉ số tương tự' mà git dường như được tính khi đổi tên tệp)?

Trả lời

10

Bạn có thể ngắt các lệnh riêng lẻ.

$ git log --diff-filter=A --pretty=short -- foo 

hiển thị nhật ký cho tệp "foo". Tùy chọn --diff-filter chỉ hiển thị các cam kết trong đó tệp đã được thêm ("A") và hiển thị nó theo định dạng cô đặc (tùy chọn --pretty=short). (Các -- là một tiêu chuẩn cho rằng "không có gì mà sau là một lựa chọn", và tất cả mọi thứ sau đó là một danh sách tên tập tin mà trên đó các bản ghi cần được áp dụng.)

Sau đó:

$ git blame -C -C -f $commit^! -- foo 

git blame chú thích mỗi dòng của một tập tin với thông tin từ lần commit cuối cùng. Tùy chọn -C -C đôi mạnh mẽ kiểm tra các dòng được sao chép từ các tệp khác. Tùy chọn -f hiển thị tên tệp của cam kết ban đầu (có nghĩa là nếu một dòng được sao chép từ một tệp khác, bạn sẽ thấy tên của tệp được sao chép từ đó). $commit^! là ký hiệu cho $ cam kết; hậu tố ^! có nghĩa là loại trừ tất cả cha mẹ của $ cam kết.

Vì vậy, về cơ bản, lệnh đầu tiên (git log) giúp bạn tìm các cam kết giới thiệu các dòng được sao chép; số thứ hai (git blame) giúp bạn tìm nguồn cho bất kỳ cam kết đáng ngờ nào được trả lại bởi git log.

+0

Cảm ơn bạn đã giải thích! Lá cờ '-C -C' đôi để git đổ lỗi trông thật thú vị –

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