Làm cách nào tôi có thể tìm kiếm một tin nhắn cam kết trên GitHub?


328

Không phải trong kho Git , mà cụ thể là trong GitHub - làm cách nào để tôi chỉ tìm kiếm các thông điệp cam kết của một kho / chi nhánh cụ thể?


3
Là repo công khai hay riêng tư?

2
Làm thế nào về việc tìm kiếm một thông điệp cam kết trong tất cả các dĩa? Cố gắng tránh phát minh lại bánh xe khi kho lưu trữ chính có hơn 100 dĩa!
Daniel Sokolowski

Có thay đổi gì kể từ đó không?
Pavel imerda

Tôi muốn tìm kiếm các cam kết mạng
frumbert

Câu trả lời:


68

Kể từ năm 2017, đó là một chức năng được bao gồm trong chính GitHub .

Tìm kiếm ví dụ được sử dụng bởi họ là repo:torvalds/linux merge:false crypto policy

nhập mô tả hình ảnh ở đây Ảnh GIF từ https://github.com/blog/2299-search-commit-messages


Tôi gặp lỗi về quyền khi tìm kiếm một repo riêng mà tôi có quyền truy cập đọc / ghi.
anon58192932

1
Tôi đã xem trong năm phút và tôi không thể tìm ra con chuột đi đâu sau khi nó phóng to xuống và sang phải.
Kevin Krumwiede

1
@KevinKrumwiede có lẽ là nút "dừng ghi âm" haha
Corey Cole

Tôi đã từ bỏ và sử dụng "git log --all --grep = searhterm"
Edwin Evans

206

Bạn đã từng có thể làm điều này, nhưng GitHub đã loại bỏ tính năng này vào một thời điểm giữa năm 2013. Để đạt được điều này tại địa phương, bạn có thể làm:

git log -g --grep=STRING

(Sử dụng -gcờ nếu bạn muốn tìm kiếm các nhánh khác và các cam kết lơ lửng.)

-g, --walk-reflogs
    Instead of walking the commit ancestry chain, walk reflog entries from
    the most recent one to older ones.

143
Tại sao họ đã loại bỏ nó? Đó là một tính năng thực sự hữu ích.
Josh Brown

1
Yếu tố huyền bí: I.want.spaces.in.this.opes thường đủ.
dbrower 13/2/2015

11
Mẹo bỏ -gcờ cho hầu hết các trường hợp sử dụng phổ biến. Tôi đã không nhìn quá nhiều vào điều này, nhưng với -g, việc tìm kiếm dường như chỉ quay lại một tháng. git log -g --grep=fixtrong khi ở developchi nhánh của một repo có ~ 8000 lần cam kết kéo dài hai năm, chỉ lùi xa đến ngày 2 tháng 2
Dan Dascalescu

1
@DanDascalescu Lạ thật, tôi đã có thể tìm thấy các cam kết quay lại ít nhất 5 tháng với -gcờ.
Chrispy

134

Cập nhật (2017/01/05):

GitHub đã xuất bản một bản cập nhật cho phép bạn tìm kiếm trong các thông điệp cam kết từ trong UI của họ. Xem bài đăng trên blog để biết thêm thông tin.


Tôi đã có cùng một câu hỏi và liên lạc với ai đó GitHub ngày hôm qua:

Vì họ đã chuyển công cụ tìm kiếm của mình sang Elaticsearch, không thể tìm kiếm các thông điệp cam kết bằng Giao diện người dùng GitHub. Nhưng tính năng đó nằm trong danh sách mong muốn của đội.

Thật không may, không có ngày phát hành cho chức năng đó ngay bây giờ.


7
+1 Bạn đã tiết kiệm cho tôi thời gian vô ích trong GitHub tự hỏi làm thế nào để đạt được những gì tôi cho là sẽ là một phần rõ ràng của chức năng. Vì vậy, bây giờ chúng ta phải sao chép repo cục bộ để grep thông qua dòng lệnh thay thế. Trời ạ, đó là tiến bộ nhỉ?! ;)
McNab

68
Ngay cả tìm kiếm nâng cao của họ trong Giao diện người dùng web cũng không cho phép tìm kiếm trên trường quan trọng nhất - thông báo cam kết thực tế. Đó là IMO hoàn toàn vô lý. Github có được hành động của bạn với nhau!
Brad Thomas

22
Đúng. Quên thực tế là họ đã xây dựng một dịch vụ web giúp cách mạng hóa và phổ biến phần mềm nguồn mở, thực tế là họ không có tính năng này làm cho nó trở thành một sự giả mạo hoàn toàn!
Jon Cairns

12
Cảm ơn bạn đã dành thời gian để xuất bản nội dung bài diễn thuyết của bạn với GitHub ở nơi công cộng dễ tìm thấy. Thật vô lý khi đây là cách duy nhất để công chúng có được thông tin như vậy - thật ngu ngốc khi GitHub không có trình theo dõi vấn đề công cộng - nhưng với sự ngu ngốc như vậy, những gì bạn đã làm ở đây là một cách hữu ích để ngăn chặn hàng trăm những người khác từ lãng phí thời gian gửi trong cùng một yêu cầu. Cảm ơn bạn cho hàng trăm giờ năng suất bạn đã tiết kiệm.
Đánh dấu Amery

1
Cũng không tốt hơn nhiều so với công cụ theo dõi công khai của Atlasian, nơi có đầy đủ các vấn đề mở 7 năm tuổi với 1000 lượt nâng cấp ...
Người hỏi

58

Câu trả lời ngắn gọn là, bạn không thể tìm kiếm thông điệp cam kết trực tiếp trên trang web github.com. Hiện tại chúng tôi đề xuất git grepgiải pháp cục bộ mà những người khác trong chủ đề này đã đề xuất.

Tại một thời điểm, GitHub đã cung cấp một git greptìm kiếm kiểu trên các thông điệp cam kết cho một kho lưu trữ duy nhất. Thật không may, cách tiếp cận này đã làm lộ ra sự từ chối dịch vụ có thể khiến máy chủ tệp không thể truy cập được. Vì lý do này, chúng tôi đã loại bỏ git greptìm kiếm.

Các ước tính về phong bì hiện tại đặt số lượng cam kết trong GitHub ở đâu đó quanh mốc 80 tỷ. Mặc dù các kỹ sư của Google cười sau lưng chúng tôi, đây là một số lượng tài liệu khá lớn để lưu trữ trong ElasticSearch. Chúng tôi muốn làm cho bộ dữ liệu này có thể tìm kiếm được, nhưng nó không phải là một dự án tầm thường.


2
+1. Điều đó dường như xác nhận những gì tôi nghĩ khi viết câu trả lời của mình : thông điệp cam kết không được lập chỉ mục: bạn đang làm việc với lập chỉ mục git diff's(có nghĩa là nội dung của các cam kết, không phải siêu dữ liệu cam kết)
VonC

Làm thế nào về nút "nhảy để cam kết"? Hiện tại nó có thể truy cập từ URL - stackoverflow.com/a/12214817/817632 nhưng không có giao diện cho nó (không phải tôi biết). Ca sử dụng - tìm hàm băm cam kết ở đâu đó trong bower.json thay vì phiên bản và muốn xem chính xác cam kết này làm gì. Nó sẽ tiết kiệm thời gian googling.
Olga

44

Điều này đã bị xóa khỏi GitHub. Tôi sử dụng:

$git log --all --oneline | grep "search query"

nhập mô tả hình ảnh ở đây

Bạn cũng có thể lọc theo tác giả:

$git log --all --oneline --author=rickhanlonii | grep "search query"

3
Điều này làm việc cho tôi, nhưng câu trả lời được đánh giá cao nhất thì không.
makdad

21

Từ trang trợ giúp về mã tìm kiếm , có vẻ như điều này là không thể.

Bạn có thể tìm kiếm văn bản trong kho lưu trữ của mình, bao gồm khả năng chọn tệp hoặc đường dẫn để tìm kiếm, nhưng bạn không thể chỉ định rằng bạn muốn tìm kiếm trong các cam kết.

Có lẽ gợi ý điều này cho họ ?


18
Điều này có vẻ giống như trường hợp sử dụng "mặc định" hơn khi tìm kiếm thông qua repo. Đặc biệt đối với ai đó làm quen với một kho lưu trữ mới với hàng tấn cam kết. Họ chắc chắn nên xem xét thêm điều này.
Jose Browne

19

Bạn có thể làm điều này với các kho lưu trữ đã được Google thu thập dữ liệu (kết quả khác nhau tùy theo kho lưu trữ).

Tìm kiếm tất cả các chi nhánh của tất cả các kho được thu thập thông tin cho "giấy phép thay đổi"

Trang web "thay đổi giấy phép": https://github.com/*/*/commits

Tìm kiếm nhánh chính của tất cả các kho được thu thập thông tin cho "giấy phép thay đổi":

Trang web "thay đổi giấy phép": https://github.com/*/*/commits/master

Tìm kiếm nhánh chính của tất cả các kho lưu trữ twitter được thu thập thông tin cho "giấy phép thay đổi"

Trang web "thay đổi giấy phép": https://github.com/twitter/*/commits/master

Tìm kiếm tất cả các nhánh của kho lưu trữ twitter / some_project cho "giấy phép thay đổi"

Trang web "thay đổi giấy phép": https://github.com/twitter/some_project/commits


4
@DZenBot nếu đó không phải là repo công khai, thì có khả năng bạn đã có một bản sao cục bộ để git grep, tôi chỉ đưa ra câu trả lời này cho những ai không muốn sao chép toàn bộ repo công khai để tìm ra khi nào một số thay đổi được thực hiện. Tôi sử dụng nó chủ yếu để tìm các cam kết loại bỏ hỗ trợ cho các phiên bản gtk cũ hơn hoặc khi giấy phép thay đổi thành gpl3
technosaurus

15

Cập nhật tháng 1 năm 2017 (hai năm sau):

Bây giờ bạn có thể tìm kiếm tin nhắn cam kết ! (vẫn chỉ trong nhánh chính)

https://cloud.githubusercontent.com/assets/1387653/21622772/61a5c7a6-d1bc-11e6-809d-134936a4ac05.gif


Tháng 2 năm 2015: Không chắc chắn điều đó có thể xảy ra, xem xét cơ sở hạ tầng tìm kiếm hiện tại trên Elaticsearch (được giới thiệu vào tháng 1 năm 2013 ).

Như một câu trả lời "rút ra từ các nguồn đáng tin cậy và / hoặc chính thức", đây là một cuộc phỏng vấn được thực hiện với những người GitHub phụ trách giới thiệu Elaticsearch tại GitHub (tháng 8 năm 2013)

Tim Pease : Chúng tôi có hai loại tài liệu trong đó: Một là tệp mã nguồn và loại còn lại là kho lưu trữ. Cách mà git hoạt động là bạn có các cam kết và bạn có một chi nhánh cho mỗi cam kết. Các tài liệu lưu trữ theo dõi các cam kết gần đây nhất cho kho lưu trữ cụ thể đó đã được lập chỉ mục. Khi người dùng đẩy một cam kết mới lên tới Github, sau đó chúng tôi sẽ kéo tài liệu kho lưu trữ đó từ elaticsearch. Sau đó, chúng tôi thấy cam kết được lập chỉ mục gần đây nhất và sau đó chúng tôi nhận được một danh sách tất cả các tệp đã được sửa đổi hoặc thêm hoặc xóa giữa lần đẩy gần đây và những gì chúng tôi đã lập chỉ mục trước đó. Sau đó chúng ta có thể tiếp tục và chỉ cập nhật những tài liệu đã được thay đổi. Chúng ta không phải lập chỉ mục lại toàn bộ cây mã nguồn mỗi khi có ai đó đẩy.

Andrew Cholakian: Vì vậy, các bạn chỉ có chỉ số, tôi giả sử, chi nhánh chính.

Tim Pease: Đúng. Đây chỉ là người đứng đầu chi nhánh chính mà bạn sẽ đến đó và vẫn còn rất nhiều dữ liệu, hai tỷ tài liệu, 30 terabyte.

Andrew Cholakian: Đó là rất lớn.

[...]

Tim Pease: Với mã nguồn lập chỉ mục khi đẩy, đó là một quá trình tự phục hồi.
Chúng tôi có tài liệu lưu trữ đó theo dõi các cam kết được lập chỉ mục cuối cùng. Nếu chúng ta bỏ lỡ, tình cờ bỏ lỡ ba lần cam kết khi những công việc đó thất bại, lần cam kết tiếp theo sẽ đến, chúng ta vẫn đang xem xét sự khác biệt giữa cam kết trước đó mà chúng ta đã lập chỉ mục và lần thực hiện mà chúng ta đang thấy với cú hích mới này.
Bạn làm một git diffvà bạn nhận được tất cả các tệp đã được cập nhật, xóa hoặc thêm. Bạn chỉ có thể nói, Được rồi, chúng tôi cần xóa các tệp này. Chúng tôi cần thêm các tệp này và tất cả những thứ đó. Đó là tự phục hồi và đó là cách tiếp cận mà chúng tôi đã thực hiện với khá nhiều kiến ​​trúc.

Điều đó có nghĩa là không phải tất cả các nhánh của tất cả các repo sẽ được lập chỉ mục với cách tiếp cận đó.
Một tìm kiếm tin nhắn cam kết toàn cầu hiện không có sẵn.
Và chính Tim Pease xác nhận các thông điệp cam kết không được lập chỉ mục .

Lưu ý rằng không thể có được việc lập chỉ mục cục bộ của một bản sao địa phương của một bản sao địa phương: xem " Tìm kiếm kho lưu trữ git bằng ElasticSearch "

Nhưng đối với một repo cụ thể, cách dễ nhất vẫn là sao chép nó và thực hiện:

git log --all --grep='my search'

(Thêm tùy chọn tại " Cách tìm kiếm kho Git bằng thông điệp cam kết? ")


7

Vì điều này đã bị xóa khỏi GitHub, tôi đã sử dụng gitktrên Linux để làm điều này.

Từ thiết bị đầu cuối đi đến kho lưu trữ của bạn và gõ gitk.

Ở giữa GUI, có một hộp tìm kiếm. Nó cung cấp một lựa chọn tốt các bộ lọc:

Thanh tìm kiếm

Phạm vi - chứa, chạm đường dẫn, thêm / xóa chuỗi, thay đổi khớp dòng

Loại kết hợp - Chính xác / IgnCase / Regapi

Các trường tìm kiếm - Tất cả các trường / Tiêu đề / Nhận xét / Committer



4

Nếu bạn có một phiên bản cục bộ của kho lưu trữ, bạn có thể muốn thử tập lệnh shell thô này mà tôi đã viết để mở các trang GitHub cho tất cả các cam kết phù hợp với thuật ngữ tìm kiếm của bạn trong các tab mới trong trình duyệt mặc định của bạn:

#!/bin/sh
for sha1 in $(git rev-list HEAD -i --grep="$1"); do
    python -mwebbrowser https://github.com/RepoOwnerUserName/RepoName/commit/$sha1 >/dev/null 2>/dev/null
done

Chỉ cần thay thế https://github.com/RepoOwnerUserName/RepoName/bằng URL GitHub thực tế của kho lưu trữ của bạn, lưu tập lệnh ở đâu đó (ví dụ: githubsearch.shlàm cho nó có thể thực thi được ( chmod +x githubsearch.sh) và sau đó thêm bí danh sau vào ~/.bashrctệp của bạn :

alias githubsearch='/path/to/githubsearch.sh'

Sau đó, từ bất cứ nơi nào trong kho Git của bạn, chỉ cần làm điều này tại thiết bị đầu cuối:

githubsearch "what you want to search for"

và bất kỳ cam kết nào phù hợp với cụm từ tìm kiếm (không phân biệt chữ hoa chữ thường) của bạn sẽ có các trang GitHub tương ứng của chúng được mở trong trình duyệt của bạn. (Được cảnh báo rằng nếu cụm từ tìm kiếm của bạn xuất hiện trong hàng trăm lần xác nhận, điều này có thể làm sập trình duyệt của bạn và ăn CPU của PC trong một thời gian.)


0

Kể từ giữa năm 2019, chỉ cần nhập bất cứ thứ gì bạn muốn tìm kiếm vào hộp tìm kiếm trên cùng bên trái và sau đó nhấp vào "Cam kết".

nhập mô tả hình ảnh ở đây

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.