Чи можливо запуститись 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)
Поточна структура:
: - Роздільник
dev53modules/factory/getters.phpfunction 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