Можно ли выполнить "поиск grep" во всех ветвях проекта Git?


можно ли запустить git grep внутри все ветви источников проектного управления в Git? Или есть другая команда для запуска?

6 96

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 команды:

  1. git grep-branch - поиск во всех филиалах local & remote
  2. git grep-branch-local - поиск только в местных филиалах
  3. 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)

текущая структура:

: - разделитель

  1. отрасли: dev
  2. номер строки: 53
  3. путь к файлу: modules/factory/getters.php
  4. соответствующие строки: 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"

Если вы даете какие-либо совершить SHA1, чтобы git grep у вас есть его поиск в них, а не в рабочей копии.

для поиска всех ветвей вы можете получить все деревья git rev-list --all. Положите все это с

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

... и имейте терпение

вот как я делаю это:

git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM