github поиск по коду
Поиск кода внутри проекта Github
Есть ли способ найти что-то в коде проекта Github?
Я мог бы извлечь исходный код и выполнить его локально, но мне было интересно, возможно ли это через веб-интерфейс или стороннюю альтернативу.
Обновление января 2013: новый поиск прибыл! , основанный наasticsearch.org :
Обновление июль 2012 г. (старые времена поиска Lucene и плохая индексация кода в сочетании с неработающим графическим интерфейсом хранятся здесь для архивирования):
Поиск (основанный на SolrQuerySyntax ) теперь более разрешающий, и страшный » Invalid search query. Try quoting it. » исчезает при использовании селектора поиска по умолчанию «Все» 🙂
Вот иллюстрация grep в коде ruby: он будет искать репозитории и пользователей, а также то, что я хотел искать в первую очередь: код!
Первоначальный ответ и иллюстрация предыдущего номера (сентябрь 2012 г. => март 2012 г.)
Поиск по коду просматривает весь код, размещенный на GitHub. Вы также можете фильтровать по:
Поэтому, если вы выберете Code селектор поиска » «, тогда ваш запрос для текста в репо будет работать:
Что невероятно бесполезно от GitHub, так это:
сообщение об ошибке не поможет вам вообще.
Никакое количество » quoting it » не поможет вам избежать этой ошибки.
Итак, пользовательский опыт обычно выглядит следующим образом:
Search code inside a Github project
Is there a way to grep for something inside a Github project’s code?
I could pull the source and grep it locally, but I was wondering if it’s possible through the web interface or a 3rd-party alternative.
9 Answers 9
Update January 2013: a brand new search has arrived!, based on elasticsearch.org:
And you have many other examples of search, based on followers, or on forks, or.
Update July 2012 (old days of Lucene search and poor code indexing, combined with broken GUI, kept here for archive):
The search (based on SolrQuerySyntax) is now more permissive and the dreaded » Invalid search query. Try quoting it. » is gone when using the default search selector «Everything»:)
Here is an illustration of a grep within the ruby code: it will looks for repos and users, but also for what I wanted to search in the first place: the code!
Initial answer and illustration of the former issue (Sept. 2012 => March 2012)
For instance, Use the repo:username/repo-name directive to limit the search to a code repository.
The initial » Advanced Search » page includes the section:
The Code search will look through all of the code publicly hosted on GitHub. You can also filter by :
So if you select the » Code » search selector, then your query grepping for a text within a repo will work:
What is incredibly unhelpful from GitHub is that:
the error message doesn’t help you at all.
No amount of » quoting it » will get you out of this error.
once you get that error message, you don’t get the sections reminding you of the right association between the search selectors (» Repositories «, » Users » or » Language «) and the (right) search filters (here » repo: «).
Any further attempt you do won’t display those associations (selectors-filters) back. Only the error message you see above.
The only way to get back those arrays is by clicking the » Advance Search » icon:
the » Everything » search selector, which is the default, is actually the wrong one for all of the search filters! Except » language: «.
(You could imagine/assume that » Everything » would help you to pick whatever search selector actually works with the search filter » repo: «, but nope. That would be too easy)
you cannot specify the search selector you want through the » Advance Search » field alone!
(but you can for » language: «, even though » Search Language » is another combo box just below the » Search for » ‘type’ one. )
So, the user’s experience usually is as follows:
So, to recap, if you want to «grep for something inside a Github project’s code», as the OP Ben Humphreys, don’t forget to select the » Code » search selector.
Searching code
You can search for code on GitHub and narrow the results using these code search qualifiers in any combination.
In this article
You can search globally across all of GitHub, or scope your search to a particular repository or organization. For more information, see «About searching on GitHub.»
You can only search code using these code search qualifiers. Search qualifiers specifically for repositories, users, or commits, will not work when searching for code.
Tips:
Considerations for code search
Due to the complexity of searching code, there are some restrictions on how searches are performed:
Search by the file contents or file path
With the in qualifier you can restrict your search to the contents of the source code file, the file path, or both. When you omit this qualifier, only the file contents are searched.
Qualifier | Example |
---|---|
in:file | octocat in:file matches code where «octocat» appears in the file contents. |
in:path | octocat in:path matches code where «octocat» appears in the file path. |
octocat in:file,path matches code where «octocat» appears in the file contents or the file path. |
Search within a user’s or organization’s repositories
To search the code in all repositories owned by a certain user or organization, you can use the user or org qualifier. To search the code in a specific repository, you can use the repo qualifier.
Qualifier | Example |
---|---|
user:USERNAME | user:defunkt extension:rb matches code from @defunkt that ends in .rb. |
org:ORGNAME | org:github extension:js matches code from GitHub that ends in .js. |
repo:USERNAME/REPOSITORY | repo:mozilla/shumway extension:as matches code from @mozilla’s shumway project that ends in .as. |
Search by file location
You can use the path qualifier to search for source code that appears at a specific location in a repository. Use path:/ to search for files that are located at the root level of a repository. Or specify a directory name or the path to a directory to search for files that are located within that directory or any of its subdirectories.
Qualifier | Example |
---|---|
path:/ | octocat filename:readme path:/ matches readme files with the word «octocat» that are located at the root level of a repository. |
path:DIRECTORY | form path:cgi-bin language:perl matches Perl files with the word «form» in a cgi-bin directory, or in any of its subdirectories. |
path:PATH/TO/DIRECTORY | console path:app/public language:javascript matches JavaScript files with the word «console» in an app/public directory, or in any of its subdirectories (even if they reside in app/public/js/form-validators). |
Search by language
You can search for code based on what language it’s written in. The language qualifier can be the language name or alias. For a full list of supported languages with their names and aliases, see the github/linguist repository.
Qualifier | Example |
---|---|
language:LANGUAGE | element language:xml size:100 matches code with the word «element» that’s marked as being XML and has exactly 100 bytes. |
display language:scss matches code with the word «display,» that’s marked as being SCSS. | |
org:mozilla language:markdown matches code from all @mozilla’s repositories that’s marked as Markdown. |
Search by file size
You can use the size qualifier to search for source code based on the size of the file where the code exists. The size qualifier uses greater than, less than, and range qualifiers to filter results based on the byte size of the file in which the code is found.
Qualifier | Example |
---|---|
size:n | function size:>10000 language:python matches code with the word «function,» written in Python, in files that are larger than 10 KB. |
Search by filename
The filename qualifier matches code files with a certain filename. You can also find a file in a repository using the file finder. For more information, see «Finding files on GitHub.»
Qualifier | Example |
---|---|
filename:FILENAME | filename:linguist matches files named «linguist.» |
filename:.vimrc commands matches .vimrc files with the word «commands.» | |
filename:test_helper path:test language:ruby matches Ruby files named test_helper within the test directory. |
Search by file extension
The extension qualifier matches code files with a certain file extension.
Help us make these docs great!
All GitHub docs are open source. See something that’s wrong or unclear? Submit a pull request.
Код поиска внутри проекта Github
Есть ли способ найти что-то в коде проекта Github с помощью grep?
Я мог бы вытащить источник и найти его локально, но мне было интересно, возможно ли это через веб-интерфейс или стороннюю альтернативу.
7 ответов
Обновление от июля 2012 г. (старые времена поиска в Lucene и плохой индексации кода в сочетании со сломанным графическим интерфейсом хранятся здесь для архива):
Поиск (основанный на SolrQuerySyntax) теперь более снисходительный и устрашающий » Invalid search query. Try quoting it. » пропадает при использовании селектора поиска по умолчанию «Все» 🙂
Вот иллюстрация grep в коде ruby: он будет искать репозитории и пользователей, но также то, что я хотел найти в первую очередь: код!
Первоначальный ответ и иллюстрация к предыдущему вопросу (сентябрь 2012 г. => март 2012 г.)
Поиск кода будет просматривать весь код, публично размещенный на GitHub. Вы также можете фильтровать по:
Таким образом, если вы выберете селектор поиска » Code «, то поиск текста в репозитории будет работать:
Что невероятно бесполезно от GitHub, так это то, что:
сообщение об ошибке совершенно не помогает.
Никакое количество » quoting it » не поможет вам избавиться от этой ошибки.
Итак, опыт пользователя обычно выглядит следующим образом:
В недавних частных репозиториях есть поле поиска для поиска по этому репо.
Как ни странно, похоже, что эта функция недоступна для общедоступных репозиториев.
Хотя ответ @VonC работает для некоторых репозиториев, к сожалению, для многих репозиториев вы не можете прямо сейчас. Github просто не индексирует их (как изначально прокомментировал @emddudley). Они нигде не заявили об этом на своем веб-сайте, но они скажут вам, если вы обратитесь в службу поддержки:
От: Тим Пиз
Мы перестали добавлять новый загруженный код в наш индекс поиска кода. Объем кода превысил наш текущий поисковый индекс, и мы работаем над переходом к более масштабируемой архитектуре поиска. Прошу прощения за раздражение. У нас нет оценки того, когда будет запущен этот новый поисковый индекс, но когда он будет готов, будет опубликовано сообщение в блоге (https://github.com/blog).
К сожалению, нет никакого способа определить, какие репозитории не проиндексированы, кроме отсутствия результатов (что также может быть связано с неправильным запросом).
Также нет другого способа отследить эту проблему, кроме как ждать, пока они напишут об этом в блоге (или посмотреть здесь, на SO).
От: Тим Пиз
Боюсь, что наша система отслеживания проблем является внутренней, но мы можем уведомить вас, как только новый поисковый индекс будет запущен.
Для поиска в репозитории добавьте параметры URL /search?q=search_terms в корень репо, например:
Гугл позволяет искать по проекту, но не по коду 🙁
Я просмотрел Документы по расширению Chrome от SourceForge, а затем посмотрел только то, что мне нужно для поиска имена каталогов с самой поисковой системой Github, прочитав некоторые из документации по поиску по кодовой базе Github
Перейдите сюда: https://github.com/search и введите « шаблон репо. : user_name / repo_name «.
Например, для поиска cnn_learner в репозитории fastai пользователя fastai введите следующее:
Не удалось найти ни одного репозитория, соответствующего ‘cnn_learner repo: fastai / fastai’
Так что просто нажмите слева на «Код», и он отобразит то, что вы хотите.
Или получите результаты поиска кода напрямую с таким URL-адресом:
Поиск похожих проектов на GitHub
Гитхаб — прекрасный сайт. Но представьте, что вы нашли проект А, и хотите узнать какие еще существуют похожие проекты. Как быть?
Именно с таким вдохновением уселся я разбирать API GitHub’a. Спустя пару недель свободного времени вот что получилось:
Для большинства проектов находится пара действительно интересных предложений. Вот несколько примеров: angular.js, front end bookmarks, three.js
Основная идея для построения рекомендаций — «Разработчики которые поставили звездочку этому проекту, также поставили звездочку. ». А детали идеи, ее недостатки и ссылка на код — ниже.
Пожалуй, мне стоит признаться что я никакой не эксперт в области машинного обучения или построения рекомендационых систем. Все что описано ниже — результат экспериментального тыка и огромного любопытства.
Давай проанализируем всех фолловеров проекта А, посмотрим какие другие проекты они фолловят, и выберем наиболее часто повторяющиеся проекты? Увы, этот подход провалился с треском: среди результатов поиска рекомендаций на первые места зачастую выходят самые популярные проекты, но не обязательно имеющие отношение к текущему. Весь GitHub влюблен в Bootstrap — самый популярный проект на сегодня.
Сколько весит общая звезда?
Проект A — всего 100 звезд
Проект B — всего 200 звезд
Проект C — всего 1000 звезд
Допустим сто одних и тех же разработчиков поставили звездочку проекту А и B, и сто одних и тех же разработчиков поставили звездочку проекту А и С. Какой проект B или С будет более близким проекту А? Очевидно — B. Половина его фолловеров следят за проектом А. Лишь 10% последователей C заметили проект A.
Как же можно обобщить три переменные в одну формулу похожести? Думал я медленно и идея рассмотреть процент общих звездочек от суммарного числа звезд обоих проектов пришла не сразу:
similarity = 2 * shared_stars_count / (project_a_stars + project_b_stars)
Формула дает очень неплохие рекомендации. Как я узнал позже от Камерона Девидсона, эта формула была выведена в 1946-м году, двумя ботаниками (это не попытка оскорбить кого-либо, они действительно были специалистами в ботанике): Соренсеном и Дайсом.
К сожалению у GitHub’a отсутствует bulk API, позволяющий одним запросом достать информацию обо всех фолловерах проекта. Ко всем неудобствам ограничение в 5 000 запросов в час делает анализ проектов невыносимо долгим. Адди Османи предложил ограничиться анализом лишь нескольких сотен последователей. Экспериментально, если выбрать случайных 500 последователей проекта — результат рекомендаций не ухудшится.
Метрику сходства проектов для случайных N последователей проекта A я переписал так:
alpha = N/project_a_stars
similarity = 2 * N / (alpha * (N + project_b_stars))
Такая формулировка делает проекты с примерно одинаковым числом звезд более близкими друг другу и неплохо отсеивает шум от популярных проектов.
К сожалению даже при N = 500 время постройки анализа одного проекта занимает около семи минут.
А что если вычислить все похожие проекты заранее?
Рекомендация работает неплохо для проектов с 200+ звездами. Но сколько таких проектов на GitHub’e? Как оказалось, чуть больше семи тысяч (на момент написания кода было около 7 300).
Написав паука для поиска ников всех фолловеров популярных репозиториев, я обнаружил около 457 115 уникальных пользователей :). Теперь для каждого пользователя нужно достать его любимые проекты. Но сколько это может занять времени? Даже при очень пессимистичной оценке в 300 звездочек на фолловера, учитывая ограничение на 5 000 запросов в час, пришлось бы «копать» гитхаб 11 суток без остановки.
11 суток не так и много для хобби, да? Задача хорошо распределяется, потому если у вас есть добрый друг, готовый поделиться своим токеном на гитхабе, то можно справиться за неделю! В тот же вечер появился паук для сбора любимых проектов фолловеров.
Весело шурша сеткой, время от времени часто спотыкаясь о баги, два паука насобирали необходимые данные за… 4 дня. Как оказалось, в среднем один пользователь гитхаба дает 22 звездочки. Лишь 0.02% пользователей дали больше 600 звезд. Потому при безупречной работе пауков можно было бы построить всю необходимую базу за пару суток.
На GtHub’e больше всего ников начинается на букву ‘s’. За ними идут пользователи на ‘m’ и на ‘a’. Ники на заглавную ‘Q’ встречаются реже, чем ники на цифру 2:
В облако
Результат работы пауков я загрузил на S3. Все современные браузеры распознают CORS, потому обычным ajax запросом можно достать необходимый js файл с рекомендациями. Если вычисленных рекомендаций для проекта не существует в облаке, сайт перейдет в режим онлайн-постройки рекомендаций. Аутентифицируйтесь на гитхабе, чтобы получить большую квоту. Промежуточные данные сохраняются в локальный IndexedDB, потому можно возобновить индексацию даже после закрытия страницы.
Код
Если вы, дорогой хабрачитатель, знаете как можно улучшить рекомендации — я с огромным удовольствием! Код сайта доступен здесь: anvaka/gazer.
Ставьте звездочки проектам, которые вам нравятся — это делает приятно не только авторам репозиториев, но и может помочь другим разработчикам найти нужные проекты :).
Спасибо огромное, что дочитали до конца :)!