Поиск кода через GitHub, Sourcegraph и локальный Git
Начните поиск кода с выбора репозитория и области файлов, затем изучите найденную реализацию в контексте. Совпавшее имя символа — зацепка, а не доказательство соответствия версии зависимости или нужному поведению.
Поиск GitHub, Sourcegraph и локальная рабочая копия ищут по разным доступным данным. Используйте инструмент с доступом к нужному репозиторию; не предполагайте, что публичный экземпляр индексирует каждый репозиторий и ревизию.
Ход обработки
Сначала ограничьте запрос, затем расширяйте список результатов. Если важна версия, откройте нужную ревизию или её checkout вместо опоры на ветку по умолчанию.
Собственный язык запросов каждого сервиса
Запрос поиска GitHub может сочетать эти квалификаторы с фразой в кавычках:
repo:spring-projects/spring-framework language:java path:WebClient.java "interface WebClient"
Соответствующие фильтры Sourcegraph используют регулярные выражения для репозитория и файла:
repo:^github\.com/spring-projects/spring-framework$ lang:java file:WebClient\.java$ "interface WebClient"
| Цель | Поиск GitHub | Sourcegraph |
|---|---|---|
| Репозиторий | repo:owner/name |
Регулярное выражение repo:; закрепите границы для точного совпадения |
| Java | language:java |
lang:java или language:java |
| Область файлов | Фильтр пути path: |
Регулярное выражение file: |
| Точная фраза | Фраза в кавычках | Фраза в кавычках в режиме ключевых слов |
Это примеры построения запросов, а не измеренные количества результатов онлайн. Два фильтра пути не обязаны давать одинаковые множества: пример Sourcegraph закрепляет суффикс имени файла. Доступ, индексированное содержимое и выбранная ревизия также определяют, что можно найти.
Воспроизведение локального поиска в пустом каталоге
Небольшому примеру нужны Git и POSIX shell. mkdir намеренно завершается ошибкой, если demo-search уже существует, поэтому выберите новый рабочий каталог.
set -eu
mkdir demo-search
cd demo-search
git init -q
mkdir src docs
printf '%s\n' 'interface WebClient {}' > src/WebClient.java
printf '%s\n' 'interface WebClient is discussed here' > docs/notes.txt
git add src docs
git grep -n -F 'interface WebClient' -- src
Вывод:
src/WebClient.java:1:interface WebClient {}
Та же фраза есть в docs/notes.txt, но -- src ограничивает поиск. git grep -F считает шаблон фиксированной строкой, а -n выводит номера строк. Файлы добавлены в индекс, поскольку обычный поиск по рабочему дереву использует отслеживаемые файлы; пример не создаёт коммит. В настоящей рабочей копии замените путь и шаблон, сохранив нужную область.
Перед адаптацией прочитайте вызывающий код, тесты, лицензию и ревизию. Одинаковое объявление может вести себя иначе в другом выпуске. Проверяйте клиентский контракт через тесты ответов WebClient, а не выводите поведение из совпадения поиска.
Обсуждение