Подтвердить что ты не робот

Как grep файлы в git repo?

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

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

$ find . | grep middleware

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

Любые идеи для умных трюков?

4b9b3361

Ответ 1

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

Ответ 2

Я думаю, что git ls-files сделает трюк для вас.

Итак:

 git ls-files "*middleware*"

Ответ 3

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

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

find . -name 'middleware*'

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

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

ack -g middleware

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

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

против

ack -G 'middleware' 'pattern in file'

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

Ответ 4

У меня такая же проблема, и я просто пошел и взломал git find - если вы не используете пакет Debian вы можете просто скопировать git-find script в /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, Id быть более чем счастливым, чтобы он был интегрирован в git (лицензия еще более либеральная, вы просто нужна оболочка mksh в несколько недавней версии (должна быть достаточной), но ее самая распространенная оболочка Unix в настоящее время, так что все в порядке).

Ответ 5

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

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

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

Ответ 6

Чистое решение git

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

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

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

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

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

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

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

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

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

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

$ git grep middleware -- '*.txt'