Можно ли выполнить "поиск grep" во всех ветвях проекта Git?
можно ли запустить git grep
внутри все ветви источников проектного управления в Git? Или есть другая команда для запуска?
6 ответов:
на вопрос "как grep (поиск) зафиксировал код в истории git?" рекомендует:
git grep <regexp> $(git rev-list --all)
это поиск по всем коммитам, которые должны включать в себя все ветви.
другая форма будет:
git rev-list --all | ( while read revision; do git grep -F 'yourWord' $revision done )
вы можете найти еще больше примеров в в этой статье:
я пробовал выше на одном проекте достаточно большой, чтобы git жаловался на размер аргумента, поэтому, если вы столкнетесь эта проблема, сделать что-то вроде:
git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done)
(см. альтернативу в последнем разделе этого ответа ниже)
не забудьте эти настройки, если вы хотите их:
# Allow Extended Regular Expressions git config --global grep.extendRegexp true # Always Include Line Numbers git config --global grep.lineNumber true
этот псевдоним тоже может помочь:
git config --global alias.g "grep --break --heading --line-number"
Примечание: chernjieпредложил это
git rev-list --all
- это перебор.более утонченная команда может быть:
git branch -a | tr -d \* | xargs git grep <regexp>
что позволит вам искать только ветви (включая удаленные ветви)
вы даже можете создать для него псевдоним bash/zsh:
alias grep_all="git branch -a | tr -d \* | xargs git grep" grep_all <regexp>
Обновление Август 2016: Р. М. рекомендует в комментариях
я "
fatal: bad flag '->' used after filename
" при попыткеgit branch
версия. Ошибка была связана сHEAD
нотации сглаживания.я решил это путем добавления
sed '/->/d'
в трубе, междуtr
а тоxargs
команды.git branch -a | tr -d \* | sed '/->/d' | xargs git grep <regexp>
что есть:
alias grep_all="git branch -a | tr -d \* | sed '/->/d' | xargs git grep" grep_all <regexp>
git log
может быть более эффективным способом поиска текста во всех ветвях, особенно если есть много совпадений, и вы хотите сначала увидеть более свежие (релевантные) изменения.git log -p --all -S 'search string' git log -p --all -G 'match regular expression'
эти команды журнала список коммитов, которые добавляют или удаляют заданную строку поиска/регулярное выражение, (как правило) более поздние сначала. Элемент причины соответствующих различий быть показано, где шаблон был добавлен или удален, так что вы можете увидеть его в контексте.
найдя соответствующие фиксация, которая добавляет текст, который вы искали (например. 8beeff00d), найти ветви, содержащие фиксацию:
git branch -a --contains 8beeff00d
Я нашел это наиболее полезным:
git grep -i foo `git for-each-ref --format='%(refname)' refs/`
вам нужно будет настроить последние аргументы в зависимости от того, хотите ли вы смотреть только на удаленные и локальные ветви, т. е.:
git grep -i foo $(git for-each-ref --format='%(refname)' refs/remotes)
git grep -i foo $(git for-each-ref --format='%(refname)' refs/heads)
псевдоним, который я создал, выглядит так:
grep-refs = !sh -c 'git grep "" "$@" "$(git for-each-ref --format=\"%(refname)\"" refs/)'
даже тема старая, но я хочу поделиться своим обходным путем для остальных, кто может найти его полезным (как и я):
это можно сделать двумя общими способами: Bash или git псевдонимы
вот 3 команды:
git grep-branch
- поиск во всех филиалах local & remotegit grep-branch-local
- поиск только в местных филиалахgit grep-branch-remote
- удаленные ветки толькоиспользование такое же, как и
git grep
git grep-branch "find my text" git grep-branch --some-grep-options "find my text"
GREP using: git aliases
File ~/.gitconfig
команды должны быть добавлены вручную к , потому что
git config --global alias
оцените сложный код, который вы добавляете, и испортите его.[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 "
Примечание: когда вы добавляете псевдонимы, и они не запускаются-проверьте обратные косые черты
\
они могут потребовать дополнительного побега\
по сравнению с Баш команды.
git branch -a
- отображение всех филиалов;sed -e 's/[ \*]*//'
- Trim помещения (отbranch -a
) и * (имя активной ветви есть);grep -v -e '\->'
- игнорировать сложные имена типаremotes/origin/HEAD -> origin/master
;grep '^remotes'
- получить все удаленные ветки;grep -v -e '^remotes'
- Вам отделения за исключением удаленные филиалы;пример
git grep-branch-local -n getTastyCookies
-n
префикс номер строки совпадающие линии.[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)
текущая структура:
:
- разделитель
- отрасли:
dev
- номер строки:
53
- путь к файлу:
modules/factory/getters.php
- соответствующие строки:
function getTastyCookies($user)
GREP using: BASH
как вы должны знать: команды Bash должны храниться в
.sh
скрипты или запускаются в оболочке.местные отделения только
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"