2012-04-18 27 views
91

Vì vậy, nếu tôi có một tập tin gọi là foo.rb và nó được đem lại cho tôi một lỗi cho một phương pháp thiếu gọi thanh, vì vậy tôi muốn tìm kiếm lịch sử của foo .rb cho chuỗi bar để xem liệu nó đã từng được xác định trong quá khứ chưa.Git tìm kiếm chuỗi trong một lịch sử tập tin duy nhất

Tôi thấy điều này Search all of Git history for a string?

Nhưng điều này tìm kiếm tất cả các file. Tôi chỉ muốn tìm kiếm trong một tập tin.

+4

Cũng giống như một FYI, bạn có thể nối thêm '- filename' vào một loạt lệnh git nếu bạn muốn giới hạn nó thành một tệp. –

Trả lời

134

Đối với mục đích này, bạn có thể sử dụng tùy chọn -S git log:

git log -S'bar' -- foo.rb 
+20

Hoặc 'git log -G'bar '- foo.rb' để tìm kiếm diff có chứa 'bar' thay vì cho các commit thay đổi số lần xuất hiện của 'bar' (xem manpage git-log). –

+0

Nó không làm việc cho tôi với các dấu ngoặc kép, tôi đã phải sử dụng '-Sbar' cho nó để tìm kiếm _bar_. Có lẽ nó có liên quan đến tôi bằng cách sử dụng dòng lệnh của Windows. – zbr

+0

nói cách khác, '-G' dành cho tìm kiếm regex ... đây cũng là một tham chiếu tuyệt vời: https://stackoverflow.com/a/4472267/2586761 – ptim

1

Có một ghi đè cho lệnh git log (từ manual):

$ git log Makefile  # commits that modify Makefile 

Vì vậy, bạn có thể sử dụng:

git log foo.rb | grep "bar" 
+2

Cảm ơn, nhưng điều này chỉ tìm kiếm lịch sử cam kết chứ không phải lịch sử của nguồn của tệp. –

+2

Có một ghi đè khác là tìm kiếm thay đổi dữ liệu chuỗi: git log -S'foo() '# cam kết thêm hoặc xóa bất kỳ dữ liệu tệp nào khớp với chuỗi' foo() ' –

+1

Bạn cũng có thể thử sử dụng tham số --full-diff . Nhật ký không chỉ hiển thị lịch sử cam kết, nhưng cũng khác. –

10

Hoặc có thể bạn thử cái này (từ các câu hỏi liên quan Search all of git history for string)

git rev-list --all foo.rb | (
    while read revision; do 
     git grep -F 'bar' $revision foo.rb 
    done 
) 

Nó sẽ thực sự tìm kiếm nội dung tập tin và không cam kết tin nhắn/bản vá lỗi cho bất kỳ sự xuất hiện của quán bar.

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