Есть ли способ исключить определенные пути / каталоги / файлы при поиске в репозитории git с помощью git grep
? Что-то похожее на --exclude
опцию в обычной grep
команде?
Мне нужно использовать, git grep
потому что использование grep
напрямую работает слишком медленно в больших репозиториях git.
Ответы:
Это невозможно, но недавно это обсуждалось . Предлагаемый обходной путь по ссылке:
ИЗМЕНИТЬ см. Только один ответ , так как git 1.9.0 это возможно.
источник
В git 1.9.0 в s
exclude
было добавлено «волшебное слово»pathspec
. Поэтому, если вы хотите искатьfoobar
в каждом файле, кроме тех, которые соответствуют,*.java
вы можете сделать:Или используйте
!
"краткую форму" для исключения:Обратите внимание, что в версиях git до v2.12 при использовании исключения у
pathspec
вас должен быть хотя бы один «включительно»pathspec
. В приведенных выше примерах это./*
(рекурсивно включить все в текущем каталоге). В git v2.13 это ограничение снято иgit grep foobar -- ':!*.java'
работает без расширения./*
.Вы также можете использовать что-то вроде
:(top)
(короткая форма :),:/
чтобы включить все, что находится в верхней части репозитория. Но тогда вы, вероятно, также захотите настроить исключение,pathspec
чтобы оно начиналось сверху::/!*.java
(в противном случае он будет исключать только*.java
файлы из вашего текущего каталога).Там хорошая ссылка для всех «волшебных слов» разрешенных в
pathspec
в git-scm.com (или толькоgit help glossary
). По какой-то причине документы на kernel.org действительно устарели, хотя они часто появляются первыми при поиске в Google.источник
git grep clock.gettime -- './*' ':!arch/**' ':!drivers/**'
чтобы исключить несколько целых каталогов. Я не думаю, что это предотвращает рекурсию.git config alias.mygrep '!git grep "$@" -- "${GIT_PREFIX}/*" ":!*.java*" #'
. Тогда простоgit mygrep foobar
. (Используя псевдоним shell # trick и текущийgit grep
иgit ls-files
из подкаталогов, и имена файлов обоих отчетов относительно текущего каталога (даже если вы используете':(top)'
include pathspec). Обе команды имеют--full-name
возможность сообщать имена относительно корня, но по умолчанию это отключено.Обновление: для git> = 1.9 есть встроенная поддержка шаблонов исключения, см. Только один ответ .
Это может показаться обратным, но вы можете передать список файлов, не соответствующих вашему шаблону исключения,
git grep
следующим образом:grep -v
возвращает все пути, которые не совпадают<exclude-pattern>
. Обратите внимание, чтоgit ls-files
также принимает--exclude
параметр, но он применяется только к неотслеживаемым файлам .источник
Вы можете пометить файлы или каталоги как двоичные, создав файл атрибутов в вашем репозитории, например
Совпадения в двоичных файлах перечислены без строки включения, например
источник
Используя пример @kynan в качестве основы, я создал этот скрипт и поместил его в свой путь (
~/bin/
) какgg
. Он использует,git grep
но избегает некоторых указанных типов файлов.В нашем репо много изображений, поэтому я исключил файлы изображений, и это сокращает время просмотра до 1/3, если я просматриваю все репо. Но сценарий можно легко изменить, чтобы исключить другие типы файлов или шаблоны geleral.
Примечание 1
В соответствии с этим должна быть возможность дать объекту имя
git-gg
и уметь вызывать его как обычную команду git, например:Но я не могу заставить это работать. Я создал сценарий в своем
~/bin/
и сделалgit-gg
символическую ссылку в/usr/lib/git-core/
.Заметка 2
Команду нельзя превратить в обычный
sh
псевдоним git, поскольку в этом случае она будет вызываться из корня репозитория. И я не этого хочу!источник