Forkuj z głową.
17 komentarzy | Kategorie: Git, Programowanie | trackbackTagi: dobre praktyki fork git github opensource
Stwierdzenie, że idea wolnego oprogramowania to wspaniała rzecz nie będzie zbyt odkrywcze. Na tej idei może skorzystać praktycznie każdy, niezależnie czy jest wielką korporacją, średnią lub małą firmą czy też "niedzielnym" koderem. Czyż to nie wspaniałe, że można zbudować praktycznie dowolnie skomplikowane oprogramowanie i nie trzeba za to płacić ogromnych pieniędzy?
Świat ten rządzi się swoimi prawami. Istnieje głównie dlatego, że są ludzie, którzy dzielą się swoim kodem (nie oszukujmy się, większość z nas tego nie robi), rzecz jasna tylko ten dobry jest zauważany i używany przez innych. Co lepsi urastają nawet do miana "celebrytów". Któż z programistów Rubiego nie zna takich osób jak Yehuda Katz czy też Ryan Bates (ten ostatni jest przykładem tego iż nie zawsze chodzi o oprogramowanie)?
Jedną z idei towarzyszącej temu ekosystemowi jest "forkowanie" (na język polski trzeba by było to przetłumaczyć jako "skopiuj kod, na przemian udoskonalaj go i dziel się z innymi"). Niektórzy mogą odnieść wrażenie, że to zjawisko jest dosyć młode i jest dzieckiem twórców GitHuba. Prawda jest jednak taka, że to zjawisko jest stare jak świat, a wspomniany serwis tylko go spopularyzował czy też wręcz uczynił prostackim (bo czymże jest to jedno kliknięcie w przycisk "fork"?).
Powiem Wam, że to co zrobiono na GitHubie było bardzo nieprzemyślane i głupie. Zanim stwierdzisz, że bredzę przeczytaj proszę do końca to co mam Ci do powiedzenia.
Cofnijmy się do czasów gdy jeszcze GitHub nie istniał. Każdy kto chciał rozwijać swoją wersję jakiegoś projektu (czyli sforkować) mógł to robić. Nie istniała żadna techniczna przyczyna by tego nie robić. Jednakże czynili to nieliczni. Po pierwsze wymagało to odrobinę wysiłku (skopiuj kod, załóż własne repozytorium), po drugie trzeba było mieć konkretny pomysł na własny fork. Że co, pomysł? Ano właśnie tak! Fork bez konkretnego celu jest niczym innym jak zbędną kopią oryginału. To, że dorzucisz do niego kilka swoich zmian (które najczęściej wynikają z jakiejś konkretnej potrzeby i nie przyda się innym) nie czyni go czymś użytecznym. Wręcz przeciwnie. Nikogo nie obchodzi to, że potrzebowałeś opcji "--bardzo-specjalna-zachcianka" i dlatego zrobiłeś forka. Bądź tak miły i zachowaj te zmiany dla siebie i nie pokazuj je innym.
Tak jak wspomniałem - fork musi mieć konkretny cel. Cel, które nie da się zrealizować w projekcie "matce". To, że autor nie chce zmergować Twojego wspaniałego patcha z "bardzo specjalną zachcianką" ciągle nie jest wystarczającym powodem (gdyby tak robili wszyscy to ich kod zamieniłby się bardzo szybko w coś brzydkiego i cuchnącego). Nie ma nic złego w tym, że kopiujesz czyjś kod (oczywiście jeśli pozwala na to licencja), ale wystawianie go dla innych i nazywanie tego Twoim własnym forkiem jest kłamstwem w żywe oczy.
Najgorsze jest to że robi się niepotrzebny bałagan. Są takie projekty, że ciężko jest rozróżnić który projekt jest tym oryginalnym. Tylko dlatego, że autorowi nie chciało się napisać w pliku README "Hej, to tylko mój prywatny fork gdzie eksperymentuję z bardzo specjalną zachcianką. Używaj proszę wersji oryginalnej." Wiem, że GitHub pokazuje umieszcza napis "forked from", ale to wciąż za mało. Nie pozwala mi to rozróżnić forków stworzonych bo taką zachciankę miał forkujący od forków, które faktycznie wnoszą coś nowego (innego) do projektu. Tym bardziej, że w przypadku gdy projekt zostanie po prostu sklonowany, a potem wypchany ze zmianami taki napis się nie pojawi (a powinien to być bardziej naturalny sposób powstawania forków). Nie mówiąc już o tym, że skopiowany projekt może być trzymany zupełnie gdzie indziej.
Wspomniany bałagan najlepiej widać w grafie sieci połączeń między forkami. Za przykład weźmy projekt bundler.
To tylko część grafu, ale widzimy co najmniej 3 forki, które mają po 1 commicie. Podejrzewam, że intencją autorów było poprawienie jakiejś małej rzeczy i namówienie autora oryginalnego projektu do zmergowania zmian. Takie kopie w ogóle nie powinny być widoczne dla świata bo i po co? Ten graf miał na celu pokazanie jak wygląda rozwijanie projektu, a przez ten bałagan nic z niego nie wynika. Ba, spróbujcie obejrzeć sobie ten graf dla projektu rails/rails. Niestety nie jest to możliwe a winowajcami są wszyscy Ci, którzy sforkowali railsy tylko dlatego, że robi się to załatwo.
Taki graf miałby sens gdyby było tak jak wcześniej napisałem. Wtedy zawierałby 2, 3, może 5 albo 10 (ale nie 1000!) takich pod projektów, a każdy z nich miał swój konkretny cel (np. "lepszy GC dla Rubiego"). Widać byłoby faktycznie, że ludzie pracują nad nowymi wersjami, które mają konkretne zmiany i które nie są mergowane przez autora głównego projektu.
Co można by było zrobić by poprawić tę sytuację? Jeśli chodzi o GitHuba to uważam, że sforkowanie projektu nie powinno być od razu widoczne. Niestety to raczej nie wchodzi w grę ponieważ w wersji darmowej nie można posiadać prywatnych projektów. Musimy zatem wziąć w swoje ręce. Po pierwsze nie powinniśmy tak lekkomyślnie tworzyć forków, a po prostu tworzyć lokalne klony na komputerze. Po drugie jeśli utworzyłeś fork tylko po to by prosić autora o tzw. "pull request" to napisz w README, że zainteresowani powinni używać wersji oryginalnej. Wydaje mi się, że dobrym pomysłem jest utworzenie osobnego brancha dla naszych zmian i pozostawienie w spokoju mastera (wtedy nie powinno być niepotrzebnych połączeń w grafie). Po trzecie jeśli faktycznie tworzysz fork (czyli wprowadzasz nową większą ideę do projektu) to opisz to w README. Napisz jaki cel przyświeca Twojemu forkowi i dlaczego zdecydowałeś się na swoją wersję zamiast gnębić autora o zmergowanie zmian.
Chociaż nie ma pisanych zasad by robić tak czy inaczej to i tak takie zasady istnieją. Dzięki niepisanym zasadom instalacja większości projektów w C to "make && make install". Takie niepisane zasady powinny także obowiązywać w kwestii forkowania. Inaczej sami sobie tworzymy dżunglę, w której tylko nieliczni sobie poradzą. Mam nadzieję, że chociaż część z moich argumentów ma dla Ciebie sens.
ps. Dowodem mojej tezy może być fakt, że railsy mają 929 forków (sic!), ale wciąż mają otwartych 900 ticketów! Jak widać ilość nie przekłada się na jakość.
Bredzisz ;) Bariera wejscia w projekt dzieki prostemu przyciskowi fork obnizyla sie bardzo znaczaco z korzyscia dla wszystkich.
Taki dość śmieszny kontrprzyklad na Twoje argumenty:
http://github.com/ncr/node
Fork, w ktorym podmienilem jedna litere, wlasciciel projektu wlaczyl ta zmiane bardzo szybko.
Bez przycisku fork (i edycji pliku online) - zapomnij, ze by mi sie chcialo.
Święta prawda, Radarek... Też wiele razy spotkałem się z tym, że patrzyłem na graf jakiegoś projektu i nie mogłem wymyślić, który z forków jest właściwie tym którego powiniennem użyć. Pomysł z umożliwieniem tak łatwego forkowania na GitHubie był generalnie dobry, ale powinni to w tej chwili jeszcze raz przemyśleć i trochę pozmieniać tak żeby rozwiązać te problemy, o których piszesz. Szkoda, że ten artykuł nie jest po angielsku, bo może przeczytałoby go więcej ludzi, rozwinęła by się jakaś dyskusja i goście z GitHuba też by to przeczytali :)
Jacek, To tylko Twoje wrażenie, że Twoja zmiana miała jakąkolwiek wartość. Podejrzewam, że ten błąd zostałby i tak szybko wyłapany przez kogoś innego. Czy zamierzasz dalej rozwijać projekt? Wątpię.
Kiedy railsy przeszły na gita wszyscy mówili Twoim językiem. "Będzie można łatwo i przyjemnie poprawiać bugi. Tickety będą załatwiane bardzo szybko". I co? Życie zweryfikowało te słowa.
Poprawienie jakieś małej głupoty (nawet jeżeli jest to błąd) nie ma żadnej wartości. Wartość niosą ludzie, którzy faktycznie rozwijają projekt.
Łatwe forkowanie miało zachęcić ludzi do rozwijania projektów. Według mnie to nie działa. Kto chce to i tak będzie to robić, a taki ficzer mu w tym nie pomoże.
Psi, też o tym myślałem, ale mój angielski jest tak kulawy, że mogłoby to przesłonić wartość merytoryczną (jeśli jest) tego wpisu. Jeśli ktoś czuje się na siłach to udzielę zgody na przetłumaczenie tego tekstu i umieszczenie go albo tu, albo u siebie (wg. życzenia).
Jacek Becela: To trzeba było skasować to repo, żeby nikogo nie myliło. Chyba, że uaktualniasz je mergując wszystkie późniejsze commity z oryginalnego, ale jakoś nie sądzę…
Radek: Powiedz Grzegorzowi, żeby pogadał z kumplami z GitHuba i załatwił sprawę :)
@radarek @sharnik bede lobbowal zeby specjalnie dla Radka dodali checkbox "Nie godzien by sie wyswietlac na grafie" :)
A tak na powaznie to zgadzam sie z Radkiem w kwestiach: tworzenia branchy dla swoich ficzerow, co kazdy z nas i tak przeciez robi :), kasowania forkow po zmergowaniu zmian do oryginalnego projektu oraz sygnalizowaniu w Readme faktycznego przeznaczenia forka.
@radarek
"Jacek, To tylko Twoje wrażenie, że Twoja zmiana miała jakąkolwiek wartość. Podejrzewam, że ten błąd zostałby i tak szybko wyłapany przez kogoś innego."
"Poprawienie jakieś małej głupoty (nawet jeżeli jest to błąd) nie ma żadnej wartości. Wartość niosą ludzie, którzy faktycznie rozwijają projekt."
Skoro po paru minutach od wyslania pull requesta wlasciciel projektu wlaczyl ta zmiane, to sadze ze raczej miala wartosc.
Często sam dostaje pull requesty - wygodna sprawa. Bez tanich forkow niemozliwa. Komu by sie chcialo wysylac patcha mailem, albo zalaczac w jakims systemie ticketow...
Pamiętam dobrze czasy gdy Rails byl w svn (doczekalem sie 3 komitow w projekcie za tamtych czasow). Wygoda patchowania railsow i pracy nad nimi dzis jest nieporownywalnie wieksza.
Zamiast podawac ilosc otwartych ticketow jako argument przeciw forkom, proponuje porownac czestotliwosc commitow przed i po przejsciu na git.
Jacek, ja nie mam nic do samego forkowania (czy też bardziej precyzyjnie - klonowania, dla mnie fork to trochę więcej niż sklonowane repo). Jednakże jeśli ktoś zrobił to tylko dla poprawienia buga (a tak jest zapewne w 90% przypadkach z tych ponad 900 "forkowiczów" railsów) to po całej sprawie mógłby chociaż usunąć repo.
Na blipie ^psionides napisał mi coś takiego:
I tu się podpisuję obiema rękami. Te mikroforki w ogóle nie powinny być widoczne dla pozostałych bo tylko generują niepotrzebny szum informacyjny.
Ja się zgadzam całkowicie z Jackiem Bacelą. Nie ma co narzekać na możliwość łatwego forkowania. Dla mnie sforkowanie prjektu dla kilku małych zmian nie jest czymś złym. Ułatwia mi to w wielu wypadkach pracę i nie zamierzam przed każdym forkiem myśleć nad tym dlaczego forkuję ;-)
I nie sądzę, żeby więcej niż kilka osób się nad tym zastanowiło.
Jedynym sposobem na poprawienie sytuacji jest to co proponujecie: jakaś reakcja ze strony githuba. Tylko nie wiem czy checkbox "pokaż moje zmiany na grafie" wystarczy (wtedy trzeba będzie jeszcze przekonywać ludzi, żeby go nie ustawiali bez powodu ;-).
Najwygodniej było by gdyby github pokazywał tylko kilka(naście) najbardziej aktywnych forków (albo ostatnio rozwijanych).
A to nie jest przypadkiem kwestia nazewnictwa? "fork" z jednym commitem który poprawia jakiś błąd to tak naprawdę "branch" i powinien zostać włączony do gałęzi master. Czy ja po prostu czegoś nie rozumiem?
Dodam coś od siebie, a jakże! Kwestię odnajdywania lokalizacji oryginalnego projektu rozwiązuje Google, nikt nie linkuje bezwartościowych forków. Rozumiem Twój punkt widzenia Radarek, bałagan może jest na githubie ale imho nie w cyberprzestrzeni uporządkowanej przez algorytmy sortujące wyszukiwarek :)
A co powiecie na to, żeby forkom prawdziwym, tłustym i pełnoprawnym zmieniać nazwę (zakładka admin)? Wg mnie, mogłoby to rozwiewać skutecznie wątpliwości (jeśli zostanie podłapane) bez ingerencji githuba.
Wlasnie na to trafilem i sobie przypomnialem o tej dyskusji: http://github.com/blog/673-starring-gists
Zgadzam się w kwestii branchowania do robienia własnych zmian.
Natomiast forkowanie, choć prowadzi do pewnego chaosu, to jednak nie zwiększa trudności w pozyskaniu biblioteki (rubygems!) czy zorientowaniu się który fork jest oficjalny.
A bariera poprawiania czy rozwijania projektów została dzięki temu one-click-fork tak rewelacyjnie obniżona, że ja też swoje dołożyłem do kilku projektów, do których bez tego przycisku może niekoniecznie by mi się chciało.
Github FTW!
Oraz: masz jakiś konkretny przykład projektu który sprawił Ci trudności (w znalezieniu "oficjalnego" repo), czy tak sobie fantazjujesz? ;)
@Drogomir:
Mi by się najbardziej podobała opcja w stylu "oznacz fork jako nierozwijany/nieaktywny" albo "wskaż polecany fork" (albo żeby przy każdym projekcie wyświetlał się najbardziej aktywny i najświeższy fork), coby ludziki trafiające przypadkiem na mojego forka zrobionego dla 1-2 ficzerów nie miały "problemu Radarka" ;)
Ewentualnie -- kasowanie repo po wciągnięciu do upstreamu. No ale wtedy pojawia się bariera psychologiczna "a jeśli za miesiąc znów coś będę chciał dopisać?".
Generalnie zgadzam się z Jackiem i Drogomirem -- łatwość forkowania na githubie przysłużyła się tysiącom projektów. Odrobina chaosu to bardzo niewielka cena takiego rozwoju.
Tomash, przykłady oczywiście, że mam - i to z życia wzięte. Przykładowo delayed_job. Najpierw rozwijała jedna osoba, potem robiła to kolejna. Graf na githubie jednak pokazywał sporo innych forków, które też coś były aktualnie rozwijane.
Nawet jeśli jestem w stanie określić w miarę oficjalny fork to nie rozwiązuje to w żaden sposób problemu. Weźmy na przykład plugin jrails (który aktualnie mi przysporzył problemy w dokładnie tej kwestii). Google najwyżej pokazują repo http://github.com/aaronchi/jrails. Jednak szybki podgląd w network pokazuje, że nie jest rozwijany od ponad roku, a inne tak. Tylko jest ich cała masa.
Dobra, powiedzmy, że wybiorę w miarę aktualny. Co dalej? Jak mam szczęście to trafię na fork, który jest aktualizowany i rozwijany. Jak nie to okaże się, że autor zaprzestał rozwijania, a fork był tylko chwilowym zrywem.
Pytanie zasadnicze. Dlaczego główny autor projektu, gdy zaprzestał rozwijania projektu nie przekazał go komuś? Dla mnie odpowiedź jest prosta: poszedł na łatwiznę, nie chciało mu się, a Ci co chcieli rozwijać projekt po prostu go sforkowali i wzięli na swoje podwórko.
A teraz pomyślmy jakby wyglądała sprawa x lat temu. Ano zapewne autor projektu ogłosiłby, że szuka następcy, który przejąłby projekt i nie byłoby problemu.
Problem nie leży oczywiście w samym fakcie forkowania (przecież przed gitem też można było zrobić to samo), ale w złym podejściu githuba. Przecież Ci ludzie rozwijający forki powinni się komunikować z głównym autorem i starać się o włączenie ich zmian do głównego repo.
Mylisz "złe podejście githuba" ze "złym podejściem DO githuba" ;)
Będę bronił one-click-fork jak niepodległości. Zwłaszcza że np. opisany przez Ciebie problem z delayed_job jest dobrym przykładem tego, jak to fork okazuje się lepszy czy bardziej przydatny niż oficjalna gałąź.
To zresztą główny powód dla którego Bundler wspiera zaciąganie gemów na surowo z gita prócz tylko oficjalnych spakowanych.