Чи можливо запуститись git grep
у всі відділення проекту Git control? Або є інша команда для запуску?
Чи можливо запуститись git grep
у всі відділення проекту Git control? Або є інша команда для запуску?
Відповіді:
Питання " Як зібрати (шукати) вчинений код в історії 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 року: RM рекомендує в коментарях
Я отримав "
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 branch
в tr або sed; git branch
- порцелянова команда, призначена для споживання людиною. Див. Stackoverflow.com/a/3847586/2562319 про кращі варіанти.
git log
може бути більш ефективним способом пошуку тексту в усіх галузях, особливо якщо збігів багато, і ви хочете спочатку побачити новіші (відповідні) зміни.
git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'
Цей список команд журналу виконує комісії, які додають або видаляють задану пошукову рядок / регулярний вираз, (як правило, спочатку останній. Цей -p
параметр призводить до того, що відповідна різниця відображатиметься там, де шаблон був доданий чи видалений, тож ви можете бачити його в контексті.
Знайшовши відповідний документ, який додає шуканий текст (наприклад, 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 "$0" "$@" "$(git for-each-ref --format=\"%(refname)\"" refs/)'
git for-each-ref
с --sort=-committerdate --count=100
! Дякую за оригінальну ідею!
Це можна зробити двома поширеними способами: псевдоніми Bash або Git
Ось три команди:
git grep-branch
- Пошук у всіх галузях місцевих та віддаленихgit grep-branch-local
- Пошук лише в місцевих відділенняхgit grep-branch-remote
- Тільки віддалені гілкиВикористання те саме, що git grep
git grep-branch "find my text"
git grep-branch --some-grep-options "find my text"
Команди слід додавати до ~/.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 "
Примітка. Коли ви додаєте псевдоніми, і вони не запускаються - перевірте зворотні риски, \
вони можуть вимагати додаткового скасування \\
порівняно з командами bash .
git branch -a
- Відобразити всі гілки;sed -e 's/[ \\*]*//'
- Обрізати пробіли (від 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)
Як слід знати: команди 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"
git grep-branch "find my text"
:fatal: ambiguous argument 'client': both revision and filename
-a
, що показує всі гілки? Я б запропонував використовувати параметри git branch
команди, щоб розділити брекети. Якщо дивитися на місцеві гілки, є лише одна *
, тому не потрібно уникати її для sed. Отже: лише git branch | sed -e 's/*/ /' | xargs git grep "TEXT"
для місцевих гілок, лише git branch -r | grep -v -- "->" | xargs git grep "TEXT"
для віддалених гілок, а git branch -a | grep -v -- "->" | xargs git grep "TEXT"
для всіх гілок
Ось як я це роблю:
git for-each-ref --format='%(*refname)' | xargs git grep SEARCHTERM