Как grep файлы в git repo? - PullRequest
30 голосов
/ 09 марта 2011

Я люблю git grep искать во всех файлах, зарегистрированных в репо.Это великолепно.Но возможно ли использовать его (или какую-нибудь другую команду git) для поиска файлов (независимо от содержимого)?

На данный момент я делаю это:

$ find . | grep middleware

, который работаетно он не использует индекс git, что означает, что он просматривает каждый найденный файл и сообщает о файлах, которые соответствуют .gitignore.

Есть идеи для хитрых трюков?

Ответы [ 6 ]

42 голосов
/ 09 марта 2011

Может быть, вы хотите git ls-files, который перечисляет файлы в индексе?(и автоматически подстраивается под ваш текущий каталог внутри рабочего каталога git)

23 голосов
/ 09 марта 2011

Я думаю, git ls-files поможет вам.

Итак:

 git ls-files "*middleware*"
4 голосов
/ 09 марта 2011

В этом случае вы можете рассмотреть не git-решение.

find само по себе имеет возможность делать то, что вы хотите, более эффективным способом, чем передать результаты в grep:

find . -name 'middleware*'

Вам нужно будет заключить в кавычки шаблон, чтобы оболочка * не раскрывалась перед передачей в find.

Существует мощная программа под названием ack, которая, ну, в общем, лучше, чем grep , и одно из моих любимых применений для ack - именно то, что вы упомянули - поиск файлов, которые соответствуют шаблону в дереве. ack использует регулярные выражения perl, но не файловые группы оболочки.

ack -g middleware

Если вы хотите искать в этих файлах, ack позволяет вам сделать это проще, чем писать цикл оболочки по результатам find, что grep s в каждом файле. Сравните два и посмотрите, какой из них вы предпочитаете:

for f in $(find . -name 'middleware*')
do
    grep 'pattern in file' $f
done

против

ack -G 'middleware' 'pattern in file'

Я настоятельно рекомендую ack в качестве дополнения к вашему набору инструментов.

0 голосов
/ 09 июня 2019

git теперь имеет развитую функциональность поиска (как упоминалось в предыдущем постере). Вы можете искать имена файлов, расширения, по языку программирования .. Вы можете искать внутри по содержимому файла ... и т. Д.

Поиск выполняется при входе в GitHub в поле поиска в верхнем левом углу экрана.

См. Это для деталей: https://help.github.com/en/articles/searching-code

0 голосов
/ 10 февраля 2017

У меня регулярно возникает такая же проблема, и я просто пошел и взломал git find - если вы не используете пакет Debian , вы можете просто скопировать скрипт git-find до /usr/lib/git-core/ (или сравнимо) и наслаждайтесь.

Может использоваться в нескольких режимах, самый простой из которых:

git find \*middleware\*        # or
git find '*middleware*'        # which is short for
git find -name '*middleware*'

Комбинация также возможна (и почти такая же гибкая, как обычная find, вам просто нужно явно написать -a):

git find \( -name \*.java -o -name \*.js \) -a ! -ipath \*/test/\*

У него есть еще пара опций, большинство из которых работают с фильтрацией имени или полного (частичного, то есть ниже текущего рабочего каталога) пути, некоторые из них не чувствительны к регистру (-iname и друзья), и две глобальные опции одно переключает регулярное выражение между POSIX Basic (по умолчанию) и POSIX Extended, другое переключает символические ссылки (по умолчанию включено); он находит только файлы (и символические ссылки), но не каталоги или субмодули («gitlinks») по своему дизайну.

Он также может передавать список файлов в обычный find (1) , если он не слишком длинный (его нужно передавать в командной строке), что допускает такие вещи, как…

git find -- -mtime -100

… при небольших затратах на файловую систему (find имеет доступ к файловой системе), но, с другой стороны, почти все (не относящиеся к глубине поиска) из find работают, и вы можете работать только с файлами «в индекс », т.е. известный git (присутствует в коммите HEAD или git add ed).

Хотя немного неразборчиво в отношении неразрешенных конфликтов. Если вы заметили какие-либо проблемы с ним, просто напишите мне (здесь, или через IRC).

PS: Не стесняйтесь лоббировать официальных пользователей git, чтобы объединить хранилище git-find с поддеревьями, я был бы более чем счастлив включить его в собственно git (лицензия еще более либеральна, вам просто нужна * Оболочка 1033 * в довольно недавней (50 должно быть достаточной) версии, но в настоящее время это самая распространенная оболочка Unix, так что все в порядке).

0 голосов
/ 26 сентября 2016

Pure git solution

git grep имеет встроенную поддержку, чтобы ограничить grep набором файлов. Все остальные ответы используют внешние инструменты для выполнения фактического поиска, который пропускает точку.

Пример из справочной страницы git grep .

git grep 'time_t' -- '*.[ch]'

Ищет time_t во всех отслеживаемых файлах .c и .h в рабочем каталоге и его подкаталогах.

Из описаний опций.

-- Сигнализирует об окончании опций;остальные параметры являются ограничителями.

<pathspec>…​ Если задано, ограничить поиск путями, соответствующими хотя бы одному шаблону.Поддерживаются оба начальных пути и шаблоны glob (7).

Итак, чтобы перевести ваш пример (в котором не было чего-то, что ограничивало поиск, поэтому я добавил это здесь):

$ find . -name '*.txt' | grep middleware

Вы бы сделали:

$ git grep middleware -- '*.txt'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...