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?


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 .


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,


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.


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.