W jaki sposób github poznaje język projektu?

84

Niedawno pracowałem nad projektem na github w JavaScript i C ++ i zauważyłem, że github oznaczył projekt jako C ++. Jeśli musisz wybrać jeden język, prawdopodobnie jest to prawidłowe oznaczenie, ponieważ kod C ++ jest kompilowany jako biblioteka JavaScript, ale to sprawiło, że zacząłem się zastanawiać ... w jaki sposób github wymyśla, w jakim języku oznaczyć każdy projekt?

Justin Ethier
źródło
14
Możesz uważać się za szczęściarza. Piszę projekt Ruby on Rails, ale ponieważ używam Twitter Bootstrap, Github myśli, że mój projekt to JavaScript, a nie zamierzony Ruby
2
@davblayn Myślę, że github.com/github/linguist/blob/master/lib/linguist/vendor.yml rozwiązałoby Twój problem. Przydałoby się również użycie CDN do ładowania początkowego.
Eric Wilson
3
To pytanie wydaje się być niezwiązane z tematem, ponieważ nie dotyczy programowania. Zobacz, o jakie tematy mogę zapytać w Centrum pomocy. Być może lepszym miejscem do zadawania pytań byłaby usługa Web Apps Stack Exchange .
jww
Zobacz także tag Misidentified Language w trackerze Github dla Linguist .
jww
1
Możesz powiedzieć silnikowi statystyk kłamstwa dotyczące typów plików, aby sfałszować wynik. Zobacz stackoverflow.com/a/27099628/492
CAD bloke

Odpowiedzi:

81

Aktualizacja z kwietnia 2013 r., Autorstwauclearsandwich (zespół pomocy GitHub lub „supportocat”):

Jeśli żądany język nie otrzymuje podświetlania składni, możesz wesprzeć bibliotekę Linguist, aby go dodać.


(Oryginalna odpowiedź, październik 2012)

Ten wątek na pomocy GitHub wyjaśnia to:

Po prostu podsumowuje rozmiary plików dla każdego rozszerzenia. Największy „wygrywa”.

Chcielibyśmy uniknąć otwierania plików i analizowania ich zawartości, ponieważ oba spowalniałyby proces ... ale może to być jedyna metoda rozwiązywania konfliktów takich jak ten.

Ponieważ nie jest to w 100% dokładne, niektórzy dodali:

Ja również głosowałbym za prostym przełącznikiem ręcznego nadpisywania w przypadkach, w których domysł jest błędny.


Uwaga: jak wspomina Mark Rushakoff w swojej odpowiedzi (za głosem), zgadywanie poprawiło się od tego czasu w projekcie lingwistycznym (open-source od czerwca 2011).
Możesz jednak zobaczyć, że nadal występują problemy: Problemy z językiem GitHub . Więcej informacji
znajdziesz tutaj :

Po wykryciu języka jest on przekazywany do Albino , opakowania Pygments , które wykonuje faktyczne podświetlanie składni.

Możesz dodać dyrektywy lingwistyczne w pliku .gitattributes .

VonC
źródło
2
Dzięki za informację. Wydaje mi się, że nadal nie ma możliwości ręcznej modyfikacji języka.
noob
Tak już nie jest! Poniższe odpowiedzi dotyczące lingwisty są bliższe ocenie. Sprawdź Moje repozytorium jest oznaczone jako niewłaściwy język, a mój ulubiony język nie jest rozpoznawany na help.github.com . Zastrzeżenie: pracuję w zespole wsparcia GitHub.
nuclearsandwich
@nuclearsandwich Doskonale, zaktualizowałem odpowiedź, kończąc twoją edycję. Uwaga: będę w siedzibie GitHub w piątek, 10 maja, na spotkaniu z Johnem Greetem i innymi osobami wspierającymi :)
VonC
Chcę tylko dodać, że nie zaznaczanie repozytorium lub pozwolenie użytkownikowi na wybór głównego języka byłoby o wiele wygodniejsze niż automatyczne zgadywanie, ponieważ moje repozytorium github.com/salda/file_scraper jest głównie w C ++ z odrobiną C, ale oznaczone jako 70 % Cel C.
Lukas Salich,
13

Obecnie projekt lingwistyczny Githuba służy do określania statystyk językowych, jak opisano w tym poście na blogu Github (który ukazał się kilka miesięcy po zadaniu tego pytania).

Mark Rushakoff
źródło
Doskonale, nie widziałem tego w momencie mojej odpowiedzi. +1
VonC
4

Po pierwsze, wiedz, że możesz nadpisać język wykryty dla plików w twoim repozytorium za pomocą nadpisań Linguist .

Krótko mówiąc,

  1. Każde repozytorium jest oznaczone pierwszym językiem ze statystyk językowych .
  2. Statystyki językowe zliczają całkowity rozmiar plików dla każdego wykrytego języka programowania lub języka znaczników. Sprzedane, dokumentacja i wygenerowane pliki nie są liczone.
  3. Język każdego pliku jest wykrywany przez Linguist projektu open source .

W jaki sposób Lingwista wykrywa języki?

Lingwista polega na następujących strategiach w kolejności i zwraca język, gdy tylko znajdzie idealne dopasowanie (strategia z zwróceniem jednego języka).

  1. Poszukaj modeli Emacsa i Vima .
  2. Znana nazwa pliku. Niektóre nazwy plików są powiązane z określonymi językami (npMakefile ).
  3. Poszukaj shebangu. Plik z #!/bin/bashhukiem zostanie sklasyfikowany jako Shell.
  4. Znane rozszerzenie pliku. Języki mają przypisany zestaw rozszerzeń. Istnieje jednak wiele konfliktów z tą strategią. Sprzeczne wyniki (pomyśl o C ++, C i Objective-C .h) są udoskonalane przez kolejne strategie.
  5. Zestaw reguł heurystycznych . Zwykle polegają na wyrażeniach regularnych w zawartości plików, aby spróbować zidentyfikować język (np. ^[^#]+:-Dla Prologu ).
  6. Naiwny klasyfikator bayesowski wyszkolony na przykładowych plikach . Ostatnia strategia, najmniejsza dokładność. Klasyfikator Bayesa zawsze przyjmuje podzbiór języków jako dane wejściowe; nie ma na celu klasyfikowania wszystkich języków. Zwracane jest najlepsze dopasowanie znalezione przez klasyfikator.

Co to są pliki niezarejestrowane i pliki dokumentacji?

Lingwista uważa niektóre pliki za sprzedawane , co oznacza, że ​​nie są one uwzględniane w statystykach językowych. Obejmują one biblioteki innych firm, takie jak jQuery i są zdefiniowane w vendor.ymlpliku konfiguracyjnym. Możesz także sprzedawać lub nie sprzedawać pliki w swoim repozytorium, używając nadpisań Linguist .

Podobnie, pliki dokumentacji są definiowane w programie documentation.ymli można je zmieniać za pomocą nadpisań Linguist .

Jak są wykrywane wygenerowane pliki?

Lingwista opiera się na prostych zasadach wykrywania generowanych plików, wykorzystując zarówno ścieżki, jak i zawartość plików. Wygenerowane pliki nie są uwzględniane w statystykach językowych i nie są wyświetlane w różnicach na github.com.

A co z programowaniem i językami znaczników?

W Lingwistyce każdemu językowi nadaje się typ. Typy te można znaleźć w głównym pliku konfiguracyjnym languages.yml. Statystyki uwzględniają tylko języki programowania i języki znaczników.

pchaigno
źródło
0

Po kilku majstrach z lingwistą zauważyłem to.

W przypadku plików z Shebang , Shebang jest brany pod uwagę przy określaniu języka, ale wydaje się być równo ważony względem innych żetonów . Wydaje się, że jest to duży błąd, ponieważ Shebang powinien definitywnie zdefiniować język pliku.

Może to powodować problemy z podświetlaniem.

Steven Penny
źródło
Ta odpowiedź ma kilka niedziałających linków. Odnosi się to również do tej odpowiedzi, która pojawia się na wymianie stosów: webapps.stackexchange.com/a/40110 . Szkoda, bo chciałbym spojrzeć na te linki!
shmim
-1

Rozszerzenia plików to pierwsza rzecz, która przychodzi mi do głowy.

Maarten Terpstra
źródło
Oczywiście, ale ... mój projekt zawierał między innymi pliki .jsi .cc.
Justin Ethier,