Sử dụng Git, làm thế nào tôi có thể tìm kiếm một chuỗi trên tất cả các chi nhánh?


170

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 cục bộ cho một chuỗi nhất định?

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


1
git-grep có thể là những gì bạn đang tìm kiếm, nhưng tôi không chắc bạn cần những lựa chọn nào ...
johnny

Câu trả lời:


170

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

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

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

Việc tìm kiếm mã sẽ xem qua tất cả cá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 lưu trữ (bao gồm tên người dùng): repo:
  • đường dẫn tệp: path:

Điều này gây ra cho tôi một lỗi phân khúc. Có thể là tortoisegitmerge (Windows), mặc dù.
bean5

6
Đâ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 số lượng git ref được chuyển đến git grep .... Hãy 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

1
Sẽ thật tuyệt nếu bạn có thể thêm một ví dụ cho các bộ lọc của mình, ví dụ: path:vì tài liệu trong nháy mắt không rõ ràng để áp dụng bộ lọc này ở đâu, tôi giả sử nó trước các trích dẫn trong ví dụ truy vấn của bạn?
blamb

3
Làm thế nào tôi chỉ có thể liệt kê tên chi nhánh. Hiện tại, nó liệt kê tất cả các hàm băm chứa chuỗi.
harryfeng

4
Github tìm kiếm là về ngành thạc sĩ chỉ . Từ help.github.com/articles/searching-code : "Chỉ nhánh mặc định được lập chỉ mục cho tìm kiếm mã. Trong hầu hết các trường hợp, đây sẽ là nhánh chính."
RedPanda

124

Nếu bạn sử dụng lệnh @ manojlds Git grep và gặp lỗi:

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

thì bạn nên sử dụng xargs :

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

Đồng thời xem Cách grep (tìm kiếm) mã đã cam kết trong lịch sử Git


Ngoài ra, điều này dường như tương thích hơn với các loại máy chơi game khác như vỏ cá
Daniel

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

54

Trong nhiều trường hợp git rev-list --allcó thể trả về một số lượng lớn các cam kết, mất 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 chi 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`

hoặc là:

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

Mẹo: Bạn có thể ghi đầu ra trong tệp để xem trong trình chỉnh sửa:

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

6
git show-ref --headsliệt kê hàm 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' ' -f2sẽ tốt hơn vì nó sẽ chỉ liệt kê các tên ref.
hIpPy

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

1
git show-ref --heads -schỉ xuất ra hàm băm SHA1. Ngoài ra, nếu có nhiều nhánh trỏ đến cùng một cam kết, bạn sẽ có các bản sao. Bạn có thể xóa chúng bằng sort -u, như vậygit show-ref --heads -s | sort -u | xargs git grep ...
Steve

Đây là chức năng tôi đã thêm vào bashrc của mình. Hy vọng nó sẽ giúp được ai đó:function gsearch { git grep $1 $(git show-ref --heads) | grep "refs/heads" | grep $1 } # last grep to keep grep color highlight
AFP_555

Đây phải là câu trả lời được chấp nhận. Cắt một chuỗi trên tất cả các chi nhánh nhưng đối với nội dung mới nhất chỉ là trường hợp sử dụng rất phổ biến.
dr_

21

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

Bạn không cần liệt kê tất cả các giá trị băm vì bạn sẽ nhận được các bản sao. Ngoài ra, nó cần nhiều thời gian hơn.

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

git grep "test -f /" master dev

giống như

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

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

Điều này tìm thấy giá trị băm cho đầu của tất cả các chi nhánh địa phương và chỉ tìm kiếm 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ũng cần tìm kiếm trong các chi nhánh từ xa thì hãy thêm -a:

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

Thêm nữa:

# 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- | cut -d' ' -f 1 | xargs git grep "string"

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

5
ít nhất là đối với tìm kiếm trong tất cả các chi nhánh nên: git branch -a | cut -c3- | cut -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ị mối quan hệ của các chi nhánh từ xa
Ilya Sheershoff

7

Bạn có thể thử điều này:

git log -Sxxxx  # Search all commits
git log -Sxxxx  --branches[=<pattern>]   # Search branches

1
Trên tất cả các chi nhánh:git log --all -s"search_string"
Tim Kuipers
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.