Có thể chạy git grep
bên trong tất cả các nhánh của dự án có nguồn gốc kiểm soát Git không? Hoặc có một lệnh khác để chạy?
Có thể chạy git grep
bên trong tất cả các nhánh của dự án có nguồn gốc kiểm soát Git không? Hoặc có một lệnh khác để chạy?
Câu trả lời:
Câu hỏi " Làm thế nào để grep (tìm kiếm) mã cam kết trong lịch sử git? " Đề xuất:
git grep <regexp> $(git rev-list --all)
Đó là tìm kiếm thông qua tất cả các cam kết, trong đó bao gồm tất cả các chi nhánh.
Một hình thức khác sẽ là:
git rev-list --all | (
while read revision; do
git grep -F 'yourWord' $revision
done
)
Bạn có thể tìm thấy nhiều ví dụ hơn trong bài viết này :
Tôi đã thử ở trên một dự án đủ lớn để git phàn nàn về kích thước đối số, vì vậy nếu bạn gặp phải vấn đề này, hãy làm một cái gì đó như:
git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done)
(xem phần thay thế trong phần cuối của câu trả lời này, bên dưới)
Đừng quên các cài đặt đó, nếu bạn muốn chúng:
# Allow Extended Regular Expressions
git config --global grep.extendRegexp true
# Always Include Line Numbers
git config --global grep.lineNumber true
Bí danh này cũng có thể giúp:
git config --global alias.g "grep --break --heading --line-number"
Lưu ý: chernjie đề nghị đó git rev-list --all
là một quá mức cần thiết.
Một lệnh tinh tế hơn có thể là:
git branch -a | tr -d \* | xargs git grep <regexp>
Điều này sẽ cho phép bạn chỉ tìm kiếm các chi nhánh (bao gồm các chi nhánh từ xa)
Bạn thậm chí có thể tạo bí danh bash / zsh cho nó:
alias grep_all="git branch -a | tr -d \* | xargs git grep"
grep_all <regexp>
Cập nhật tháng 8 năm 2016: RM khuyến nghị trong các ý kiến
Tôi đã nhận được một "
fatal: bad flag '->' used after filename
" khi thửgit branch
phiên bản. Lỗi được liên kết với mộtHEAD
ký hiệu răng cưa.Tôi đã giải quyết nó bằng cách thêm một
sed '/->/d'
trong ống, giữatr
và cácxargs
lệnh.
git branch -a | tr -d \* | sed '/->/d' | xargs git grep <regexp>
Đó là:
alias grep_all="git branch -a | tr -d \* | sed '/->/d' | xargs git grep"
grep_all <regexp>
git branch
tr hoặc sed; git branch
là một lệnh sứ có nghĩa là cho tiêu dùng của con người. Xem stackoverflow.com/a/3847586/2562319 để biết các lựa chọn thay thế ưa thích.
git log
có thể là một cách hiệu quả hơn để tìm kiếm văn bản trên tất cả các chi nhánh, đặc biệt là nếu có nhiều kết quả khớp và bạn muốn xem các thay đổi gần đây (có liên quan) trước.
git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'
Các danh sách lệnh log này cam kết thêm hoặc xóa chuỗi tìm kiếm / regex đã cho, (nói chung) gần đây hơn trước. Các -p
tùy chọn làm cho diff có liên quan sẽ được hiển thị nơi các mô hình đã được bổ sung hoặc loại bỏ, vì vậy bạn có thể nhìn thấy nó trong ngữ cảnh.
Đã tìm thấy một cam kết có liên quan bổ sung thêm văn bản bạn đang tìm kiếm (ví dụ: 8beeff00d), hãy tìm các nhánh có chứa cam kết:
git branch -a --contains 8beeff00d
Tôi thấy điều này hữu ích nhất:
git grep -i foo `git for-each-ref --format='%(refname)' refs/`
Bạn cần điều chỉnh các đối số cuối cùng tùy thuộc vào việc bạn có muốn chỉ nhìn từ xa so với các nhánh cục bộ hay không, tức là:
git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes)
git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)
Bí danh tôi tạo ra trông như thế này:
grep-refs = !sh -c 'git grep "$0" "$@" "$(git for-each-ref --format=\"%(refname)\"" refs/)'
git for-each-ref
với --sort=-committerdate --count=100
! Cảm ơn ý tưởng ban đầu!
Có thể làm điều đó theo hai cách phổ biến: bí danh Bash hoặc Git
Dưới đây là ba lệnh:
git grep-branch
- Tìm kiếm trong tất cả các chi nhánh địa phương và từ xagit grep-branch-local
- Chỉ tìm kiếm trong các chi nhánh địa phươnggit grep-branch-remote
- Chỉ chi nhánh từ xaCách sử dụng giống như git grep
git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"
Các lệnh nên được thêm thủ công vào ~/.gitconfig
tệp, vì git config --global alias
đánh giá mã phức tạp mà bạn thêm và làm rối nó.
[alias]
grep-branch = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | xargs git grep $@; };f "
grep-branch-remote = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' | grep '^remotes' | xargs git grep $@; };f"
grep-branch-local = "!f(){ git branch -a | sed -e 's/[ \\*]*//' | grep -v -e '\\->' -e '^remotes' | xargs git grep $@; };f "
Lưu ý: Khi bạn thêm bí danh và chúng không chạy được - hãy kiểm tra dấu gạch chéo ngược, \
chúng có thể yêu cầu thoát bổ sung \\
so với các lệnh bash .
git branch -a
- Hiển thị tất cả các chi nhánh;sed -e 's/[ \\*]*//'
- Cắt khoảng trắng (từ branch -a
) và * (tên nhánh hoạt động có nó);grep -v -e '\\->'
- Bỏ qua các tên phức tạp như remotes/origin/HEAD -> origin/master
;grep '^remotes'
- Nhận tất cả các chi nhánh từ xa;grep -v -e '^remotes'
- Nhận chi nhánh trừ chi nhánh từ xa;git grep-branch-local -n getTastyCookies
-n
Tiền tố số dòng để phù hợp với dòng.
[user@pc project]$ git grep-branch-local -n getTastyCookies
dev:53:modules/factory/getters.php:function getTastyCookies($user);
master:50:modules/factory/getters.php:function getTastyCookies($user)
Cấu trúc hiện tại là:
:
- Dấu phân cách
dev
53
modules/factory/getters.php
function getTastyCookies($user)
Như bạn nên biết: Các lệnh Bash nên được lưu trữ trong .sh
các tập lệnh hoặc chạy trong trình bao.
git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' -e '^remotes' | xargs git grep "TEXT"
git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | grep '^remotes' | xargs git grep "TEXT"
git branch -a | sed -e 's/[ \*]*//' | grep -v -e '\->' | xargs git grep "TEXT"
git grep-branch "find my text"
:fatal: ambiguous argument 'client': both revision and filename
-a
, trong đó hiển thị tất cả các chi nhánh? Tôi sẽ đề nghị sử dụng các tùy chọn cho git branch
lệnh để phân tách đau khổ. Khi nhìn vào các chi nhánh địa phương, chỉ có một chiếc duy nhất *
, vì vậy không cần phải thoát khỏi nó cho sed. Vì vậy: chỉ git branch | sed -e 's/*/ /' | xargs git grep "TEXT"
dành cho các chi nhánh địa phương, chỉ git branch -r | grep -v -- "->" | xargs git grep "TEXT"
cho các chi nhánh ở xa và git branch -a | grep -v -- "->" | xargs git grep "TEXT"
cho tất cả các chi nhánh
Đây là cách tôi làm điều đó:
git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM