2011-08-22 21 views
85

Sử dụng git, làm cách nào tôi có thể tìm kiếm trong tất cả các tệp trong tất cả các nhánh địa phương cho một chuỗi nhất định?Sử dụng git, làm cách nào tôi có thể tìm kiếm chuỗi trên tất cả các nhánh?

Github cụ thể: có thể thực hiện tìm kiếm trên trên tất cả các nhánh github không? (Có một số chi nhánh từ xa trên repo github từ xa của tôi rằng lý tưởng tôi sẽ không phải mang xuống cho tìm kiếm này ..)

+1

[git-grep] (http://www.kernel.org/pub/software/scm/git/docs/git-grep.html) có thể là những gì bạn đang tìm kiếm, nhưng tôi vẫn chưa chắc tùy chọn bạn cần ... – johnny

+0

Có thể trùng lặp của [Làm thế nào để grep (tìm kiếm) mã cam kết trong lịch sử git?] (https://stackoverflow.com/questions/2928584/how-to-grep-search-committed- code-in-the-git-history) – nekketsuuu

Trả lời

94

Bạn có thể làm điều này trên một repo Git:

git grep "string/regexp" $(git rev-list --all) 

Github tìm kiếm nâng cao có khả năng tìm kiếm mã:

Tìm kiếm mã sẽ xem xét tất cả mã được lưu trữ công khai trên GitHub. Bạn cũng có thể lọc theo:

  • ngôn ngữ: language:
  • tên kho (bao gồm tên người dùng): repo:
  • đường dẫn tập tin: path:
+0

Điều này khiến tôi bị lỗi phân đoạn. Có thể là tortoisegitmerge (Windows), mặc dù. – bean5

+1

Đây thực sự không phải là cách tốt nhất để làm điều này. Nó không kiểm soát lượng git refs được chuyển tới 'git grep ...'. Nhìn vào các câu trả lời khác, chúng tốt hơn nhiều so với câu trả lời này mặc dù nó được đánh dấu là câu trả lời được chấp nhận! – slm

+0

sẽ rất tuyệt nếu bạn có thể thêm ví dụ cho bộ lọc của mình, ví dụ: 'đường dẫn:', bởi vì tài liệu trong nháy mắt không nhìn rõ nơi áp dụng bộ lọc này, im giả sử nó trước dấu ngoặc kép trong ví dụ truy vấn của bạn? – blamb

61

Nếu bạn sử dụng git grep @manojlds và nhận được lỗi:

-bash: /usr/bin/git: Argument list too long" 

thì bạn nên u se xargs:

git rev-list --all | xargs git grep "string/regexp" 

Xem thêm How to grep (search) committed code in the git history?

+0

Ngoài ra, điều này có vẻ tương thích hơn với các loại bàn giao tiếp khác như fishshell – Daniel

+0

Cảm ơn !!! bằng cách sử dụng ZSH và điều này làm việc trong khi lệnh @manojlds đưa ra lỗi mà bạn đã đề cập! Nhưng cảnh báo, điều này có thể mất rất nhiều thời gian cho một repo lớn với một lịch sử lâu dài. – lacostenycoder

22

Trong nhiều trường hợp git rev-list --all có thể trở lại một số lượng lớn các cam kết dùng mãi mãi để quét. Nếu bạn thay vì tìm kiếm thông qua mọi cam kết trên mỗi nhánh trong lịch sử kho lưu trữ của bạn chỉ muốn tìm kiếm tất cả các mẹo chi nhánh, bạn có thể thay thế nó bằng git show-ref --heads. Vì vậy, trong tổng số:

git grep "string" `git show-ref --heads` 

hay:

git show-ref --heads | xargs git grep "string" 

Mẹo: Bạn có thể viết ra trong tập tin để xem trong trình soạn thảo.

nano ~/history.txt 
git show-ref --heads | xargs git grep "search string here" >> ~/history.txt 
+3

'git show-ref -heads' liệt kê băm và tên ref để nó (dòng thứ 2) sẽ tìm kiếm hai lần. vì vậy 'git show-ref --heads | cut -d '' -f2' là tốt hơn vì nó sẽ chỉ liệt kê các tên ref. – hIpPy

+1

Tôi không thể tin được câu hỏi này đã được hỏi và trả lời bao nhiêu lần, nhưng bạn là người duy nhất có câu trả lời * đúng *. – Sammitch

+0

'git show-ref-heads -sheads -s' chỉ xuất ra hàm băm SHA1. Ngoài ra, nếu có nhiều chi nhánh trỏ đến cùng một cam kết, bạn sẽ có bản sao. Bạn có thể loại bỏ chúng bằng 'sort -u', giống như' git show-ref -heads -s | sắp xếp -u | xargs git grep ... ' – Steve

6

Có vài vấn đề với giải pháp được liệt kê ở đây (thậm chí được chấp nhận).

  1. Bạn không cần phải liệt kê tất cả các băm khi bạn sẽ nhận được bản sao, cũng phải mất nhiều thời gian hơn.

Nó được xây dựng trên này, nơi bạn có thể tìm kiếm một chuỗi "test -f /" trên nhiều chi nhánh masterdev như

git grep "test -f /" master dev 

mà là giống như

printf "master\ndev" | xargs git grep "test -f /" 

Vì vậy, ở đây đi.

Việc này sẽ tìm các dấu băm cho đầu của tất cả các nhánh và tìm kiếm cục bộ chỉ trong các cam kết đó.

git branch -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp" 

Nếu bạn cần phải tìm kiếm tại các chi nhánh ở xa quá thì thêm -a:

git branch -a -v --no-abbrev | awk -F' *' '{print $3}' | xargs git grep "string/regexp" 

Cập nhật:

# search in local branches 
git branch | cut -c3- | xargs git grep "string" 
# search in remote branches 
git branch -r | cut -c3- | xargs git grep "string" 
# search in all (local and remote) branches 
git branch -a | cut -c3- | xargs git grep "string" 

# search in branches, and tags 
git show-ref | grep -v "refs/stash" | cut -d' ' -f2 | xargs git grep "string" 
+1

ít nhất là để tìm kiếm trong tất cả các chi nhánh phải là: ' git branch -a | cắt -c3- | cắt -d '' -f 1 | xargs git grep "string" ' hoặc nó sẽ thất bại với biểu tượng' -> 'trong danh sách tệp, biểu thị quan hệ cục bộ với các nhánh từ xa –

0

Bạn có thể thử này

git log -Sxxxx #search all commits 
git log -Sxxxx --branches[=<pattern>] #search branches 
Các vấn đề liên quan