TL; DR
Вы не можете передать имена, но вы можете предоставить имена (в виде путей) одному из двух git grep
команды.
(как ни странно, --and
должен был сделать то, что вы хотели в первую очередь - я просто отвечаю на вопрос, как это сделать без --and
.)
Умеренно длинный
Не совсем точно, какой результат вы хотите получить, но при условии, что вы хотите:
есть два довольно очевидных способа попытаться сделать это, но один из них не работает, потому что 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
с любым шаблоном в любом порядке.