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ể?
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ể?
Câu trả lời:
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 GIF từ https://github.com/blog/2299-search-commit-messages
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 -g
cờ 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.
-g
cờ 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=fix
trong khi ở develop
chi 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
-g
cờ.
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ờ.
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 grep
giả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 grep
tì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 grep
tì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.
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)
Điều này đã bị xóa khỏi GitHub. Tôi sử dụng:
$git log --all --oneline | grep "search query"
Bạn cũng có thể lọc theo tác giả:
$git log --all --oneline --author=rickhanlonii | grep "search query"
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ọ ?
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ữ).
Trang web "thay đổi giấy phép": https://github.com/*/*/commits
Trang web "thay đổi giấy phép": https://github.com/*/*/commits/master
Trang web "thay đổi giấy phép": https://github.com/twitter/*/commits/master
Trang web "thay đổi giấy phép": https://github.com/twitter/some_project/commits
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)
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ộtgit diff
và 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? ")
Vì điều này đã bị xóa khỏi GitHub, tôi đã sử dụng gitk
trê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:
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
Điều này hoạt động tốt từ bên trong Eclipse , cho đến khi GitHub thêm tính năng:
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.sh
làm cho nó có thể thực thi được ( chmod +x githubsearch.sh
) và sau đó thêm bí danh sau vào ~/.bashrc
tệ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.)