Tìm kiếm Git cho chuỗi trong lịch sử của một tệp


172

Vì vậy, nếu tôi có một tệp có tên foo.rb và nó gây ra lỗi cho một phương thức bị thiếu gọi là thanh , vì vậy tôi muốn tìm kiếm lịch sử của foo.rbbar để xem chuỗi có được xác định trước đây không.

Tôi tìm thấy Tìm kiếm này tất cả lịch sử Git cho một chuỗi?

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


6
Giống như một FYI, bạn có thể nối thêm -- filenamemột loạt các lệnh git nếu bạn muốn giới hạn nó trong một tệp.
Karl Bielefeldt

Câu trả lời:


234

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

39
Hoặc git log -G'bar' -- foo.rbđể tìm kiếm diff có chứa 'bar' thay vì các xác nhận đã thay đổi số lần xuất hiện của 'bar' (xem trang chủ git-log).
Jakub Narębski

1
Nó không hoạt động với tôi với các trích dẫn, tôi đã phải sử dụng -Sbarnó để tìm kiếm thanh . Có lẽ nó có liên quan đến tôi khi sử dụng dòng lệnh Windows.
zbr

nói cách khác, -Glà cho một tìm kiếm regex ... đây cũng là một tài liệu tham khảo tuyệt vời: stackoverflow.com/a/4472267/2586761
ptim

17

Hoặc có lẽ bạn có thể thử cái này (từ các câu hỏi liên quan Tìm kiếm tất cả lịch sử git cho chuỗi )

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

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


Đối với cửa sổ: for /F %i in ('git rev-list --all foo.rb') git grep -F bar %i foo.rb(xem dấu ngoặc kép nếu tên tệp hoặc cụm từ tìm kiếm có khoảng trắng)
bisc314

1
Đối với tôi trong Windows, nó không hoạt động mà không có "làm": for /F %i in ('git rev-list --all foo.rb') do git grep -F bar %i foo.rb (xem dấu ngoặc kép nếu tên tệp hoặc cụm từ tìm kiếm có khoảng trắng)
xberger

2

Có một ghi đè cho lệnh git log (từ thủ công ):

$ 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, không phải lịch sử nguồn của tệp.
JD Isaacks

2
Thực sự có một ghi đè khác 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 () '
Dmitry Reznik

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, mà còn khác biệt.
Dmitry Reznik

@DmitriyReznik - dường như --full-diffkhông hoạt động (như trong, không có khác biệt nào được hiển thị) mà không -p, ít nhất là trên git 1.7.9.5
sdaau

0

Tôi đã sử dụng git log -S "string" --follow -p "path of file"để hiển thị toàn bộ lịch sử của tất cả các thay đổi với chuỗi đó.

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.