2009-08-26 26 views
457

Trong kho lưu trữ mã Git, tôi muốn liệt kê tất cả các cam kết có chứa một từ nhất định. Tôi cố gắng nàyLàm thế nào để grep Git cam kết khác biệt hoặc nội dung cho một từ nào đó?

git log -p | grep --context=4 "word" 

nhưng nó không nhất thiết phải cung cấp cho tôi trở lại tên tập tin (trừ khi đó là ít mà 5 đường đi từ từ tôi tìm kiếm. Tôi cũng đã cố gắng

git grep "word" 

nhưng nó mang lại cho tôi chỉ hiển thị các tệp và không phải là lịch sử

Làm cách nào để tìm kiếm toàn bộ lịch sử để tôi có thể theo dõi các thay đổi trên một từ cụ thể?

cuốc

Trả lời

659

Nếu bạn muốn tìm tất cả các cam kết mà cam kết thông báo chứa từ nhất định, sử dụng

$ git log --grep=word 

Nếu bạn muốn để tìm tất cả các cam kết trong đó nội dung tệp (chính xác hơn: số lần xuất hiện từ "từ"), tức là tìm kiếm nội dung cam kết , sử dụng cái gọi là 'Cuốc' tìm kiếm với

$ git log -Sword 

Trong git hiện đại cũng có

$ git log -Gword 

để tìm khác biệt mà thêm hoặc loại bỏ dòng phù hợp với "từ" (còn cam kết nội dung).

Lưu ý rằng -G theo mặc định chấp nhận regex, trong khi -S chấp nhận một chuỗi, nhưng có thể được sửa đổi để chấp nhận regex bằng cách sử dụng --pickaxe-regex.

Để minh họa sự khác biệt giữa -S<regex> --pickaxe-regex-G<regex>, hãy xem xét một cam kết với diff sau trong cùng một tập tin:

+ return !regexec(regexp, two->ptr, 1, &regmatch, 0); 
... 
- hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0); 

Trong khi git log -G"regexec\(regexp" sẽ hiển thị này cam kết, git log -S"regexec\(regexp" --pickaxe-regex sẽ không (vì số lần xuất hiện của chuỗi đó không thay đổi).

+5

'git log -S' cũng hoạt động đối với trường hợp thứ hai –

+0

* -S * và * -G * trong' man git log' rất không rõ ràng. Tôi đã phải đọc và thử nghiệm ba lần để nắm bắt sự khác biệt. –

+3

@TankorSmash '-S ' Tìm những khác biệt giới thiệu hoặc xóa một phiên bản . '-G ' Tìm những điểm khác biệt có dòng được thêm vào hoặc bị xóa khớp với nhất định. –

239

git log 's sẽ tìm thấy cam kết với những thay đổi trong đó có 'chữ' với git log -Sword

+55

Điều này không hoàn toàn chính xác. -S Tìm những khác biệt giới thiệu hoặc xóa một phiên bản của . ** Lưu ý rằng điều này khác với chuỗi đơn giản xuất hiện ở đầu ra khác; ** – mayu

+4

Mặc dù đây là câu trả lời đúng, nhưng tôi chỉ giảm để khuyến khích người khác đọc câu trả lời này (http://stackoverflow.com/a/1340245/ 586983) có 3 cách khác nhau và giải thích sự tinh tế của chúng. – jakeonrails

+9

gosh! Tôi không nghĩ rằng đó là một lý do tốt để downvote một câu trả lời đúng ... bạn không tự tin bao gồm các liên kết trong một bình luận sẽ là đủ khuyến khích? – Deborah

3

Để sử dụng kết nối boolean trên biểu thức chính quy:

git log --grep '[0-9]*\|[a-z]*' 

này tìm kiếm biểu thức chính quy cho biểu thức chính quy [0-9] * hoặc [a-z] * trên bài viết cam kết.

2

vim-fugitive là linh hoạt cho loại kiểm tra đó trong Vim.

Sử dụng :Ggrep để thực hiện việc đó. Để biết thêm thông tin, bạn có thể cài đặt vim-fugitive và tra cứu turorial theo :help Grep.Và tập này: exploring-the-history-of-a-git-repository sẽ hướng dẫn bạn làm tất cả những điều đó.

6

hơn Một chiều/cú pháp để làm điều đó là: git log -S "word"
Như vậy, bạn có thể tìm kiếm ví dụ git log -S "with whitespaces and stuff @/#ü !"

9

Sau rất nhiều thử nghiệm, tôi có thể khuyên sau đây, trong đó cho thấy cam kết rằng giới thiệu hoặc loại bỏ các dòng có chứa một regexp đã cho, và hiển thị các thay đổi văn bản trong mỗi, với các màu sắc hiển thị các từ được thêm vào và loại bỏ.

git log --pickaxe-regex -p --color-words -S "<regexp to search for>" 

Mất một thời gian để chạy mặc dù ... ;-)

6

Bạn có thể thử lệnh sau:

git log --patch --color=always | less +/searching_string 

hoặc sử dụng grep theo cách sau:

git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string' 

Chạy lệnh này trong thư mục chính nơi bạn muốn tìm kiếm.

+2

Tôi thích phương pháp này vì các cam kết mà tôi đang xem có hàng trăm dòng thay đổi không liên quan và tôi chỉ quan tâm đến các bản vá thực tế liên quan đến từ mà tôi đang tìm kiếm. Để có được màu sắc sử dụng 'git log --patch --color = always | ít hơn +/search_string'. –

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