Ответ 1
Может быть, вы хотите git ls-files
, в котором перечислены файлы в индексе? (и автоматически настраивается для вашего текущего каталога в рабочем каталоге git)
Мне нравится git grep
искать во всех файлах, зарегистрированных в репо. Это здорово. Но можно ли использовать его (или какую-то другую команду git) просто использовать для поиска файлов (независимо от содержимого)?
В данный момент я делаю это:
$ find . | grep middleware
но он не использует индекс git, что означает, что он просматривает каждый найденный файл и сообщает о файлах, соответствующих .gitignore
.
Любые идеи для умных трюков?
Может быть, вы хотите git ls-files
, в котором перечислены файлы в индексе? (и автоматически настраивается для вашего текущего каталога в рабочем каталоге git)
Я думаю, что git ls-files
сделает трюк для вас.
Итак:
git ls-files "*middleware*"
В этом случае вы можете рассмотреть решение не 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
как-то добавить к вашему набору инструментов.
У меня такая же проблема, и я просто пошел и взломал 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 в настоящее время, так что все в порядке).
git теперь имеет развитую функциональность поиска (как упоминалось в предыдущем постере). Вы можете искать имена файлов, расширения, по языку программирования.. Вы можете искать внутри по содержимому файла... и т.д.
Вы ищете при входе в GitHub, в поле поиска в верхнем левом углу экрана.
Смотрите это для деталей: https://help.github.com/en/articles/searching-code
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'