Git grepping на имена файлов - PullRequest
       12

Git grepping на имена файлов

0 голосов
/ 05 октября 2019

Как я могу передать git grep список файлов, по которым я хочу найти определенный шаблон?
В частности, я делаю это:

git grep -l 'string to search' 

, и я хочу сделать еще один git grep в файлах результатов предыдущего поиска.

Попытка

git grep -l -e 'string to search' --and -e 'another string'  

не дает никаких результатов, но я знаю, что есть совпадения

Выполнение

git grep -l 'string to search' | git grep -l 'another string'

дает тот же результат, что и git grep -l 'another string'

Ответы [ 2 ]

2 голосов
/ 06 октября 2019

TL; DR

Вы не можете передать имена, но вы можете предоставить имена (в виде путей) одному из двух git grepкоманды.

(как ни странно, --and должен был сделать то, что вы хотели в первую очередь - я просто отвечаю на вопрос, как это сделать без --and.)

Умеренно длинный

Не совсем точно, какой результат вы хотите получить, но при условии, что вы хотите:

  • для каждого файла в (некоторые коммиты | некоторыенабор коммитов | индекс | рабочее дерево)

    • , если файл содержит шаблон 1

    • и файл содержит где-нибудь еще в том же файле (не обязательно в той же строке) шаблон 2

    • , затем укажите имя файла

есть два довольно очевидных способа попытаться сделать это, но один из них не работает, потому что Git не будет совпадать между строками. 1 Так что мы остались сфлористикаОчевидный метод:

  • Сначала используйте git grep -l для создания списка файлов , соответствующих первому выражению.
  • Затем используйте git grep -l для получения список файлов , соответствующих второму выражению, опционально, начиная только с тех файлов, которые созданы первыми git grep.

Чтобы объединить их как и операция, у вас есть довольно очевидный вариант использования одного из двух git grep -l выходов в качестве последовательности аргументов имени пути к другому git grep. Однако обратите внимание, что git grep принимает аргументы pathspec , а не аргументы path name , после --, который их разделяет (подробности см. В документации )). Это означает, что если любое из ваших имен файлов содержит метасимволы pathspec, это простое расширение оболочки может дать сбой. Также, вероятно, неплохо проверить, что первый grep на самом деле перечисляет некоторые файлы, но объединение их в одну команду стиля bash:

git grep -l pattern2 -- $(git grep -l pattern1)

часто может быть достаточно.

Чтобы объединитьвыше двух как операция или (список файлов, содержащих любой шаблон), проще всего использовать один git grep с несколькими шаблонами. Однако обратите внимание, что вы можете выполнить несколько операций git grep -l с полученными именами файлов, направленными во временный файл, а затем использовать программу типа comm, чтобы сообщить, что является общим и уникальным для каждого набора результатов. (Предполагается, что у вас есть comm в наборе инструментов интерпретатора командной строки.) Использование comm также позволяет обойти проблемы pathspec с особыми именами файлов, такими как (top)file.c или got*you.sh или любым другим.


1 Если Git did совпал по новым строкам, вы можете использовать расширенный или Perl-шаблон: (foo(.|\n)*bar)|(bar(.|\n)*foo), чтобы разрешить произвольный текст между двумя другими шаблонами foo и barс любым шаблоном в любом порядке.

2 голосов
/ 05 октября 2019

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

Замените его простым bash grep идолжен сделать

git grep -l 'string to search' | grep 'another string'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...