Git
Chapters ▾ 2nd Edition

6.3 GitHub - Održavanje projekta

Održavanje projekta

Sada kada znamo kako da doprinesemo projektu, hajde da pogledamo drugu stranu: kreiranje, održavanje i administracija sopstvenog projekta.

Kreiranje novog repozitorijuma

Kreirajmo novi repozitorijum na kome ćemo deliti naš projekat. Počnite klikom na dugme New repositoriy u gornjem desnom uglu komandne table, ili na dugme + u alatnoj traci pored vašeg korisničkog imena kao što se vidi na Padajući meni New repository..

Oblast _Your repositories_
Figure 110. Oblast Your repositories.
Padajući meni _New repository_
Figure 111. Padajući meni New repository.

Ovo vas vodi na formu New repository:

Forma _New Repository_
Figure 112. Forma New Repository.

Sve što ovde stvarno treba da uradite je da date ime projektu; ostala polja su potpuno neobavezna. Zasad, samo kliknite na dugme Create repository, i bum — imate nov repozitorijum na GitHub-u, nazvan <korisnik>/<ime_projekta>.

Pošto još nemate nikakav kôd, GitHub će vam pokazati upustva za to kako da napravite potpuno nov Git repozitorijum, ili da ga povežete sa postojećim Git projektom. Nećemo se vraćati na ovo ovde; ako treba da se podsetite, bacite oko na Osnove Gita.

Sada kada je vaš projekat hostovan na GitHub-u, možete da date URL svakom s kim želite da podelite projekat. Svakom projektu na GitHub-u se može pristupiti preko HTTP-a https://github.com/<korisnik>/<ime_projekta>, i preko SSH-a github@github.com:<korisnik>/<ime_projekta>. Git može da pribavlja sa URL-ova i gura na njih, ali se kontrola pristupa vrši na osnovu akreditacije korisnika koji im pristupa.

Note

Često se preferira deljenje URL-a baziranog na HTTP-u za javni projekat, pošto korsnik ne mora da ima GitHub nalog da bi mu pristupio za kloniranje. Korisnici će morati da imaju nalog i aploudovan SSH ključ da pristupe vašem projektu ako im date SSH URL. HTTP URL je takođe isti URL koji će prekopirati u brauzer da bi pogledali projekat tamo.

Dodavanje kolaboratora

Ako radite sa drugim ljudima i želite da im date pristup za komitove, treba da ih dodate kao kolaboratore. Ako Ben, Džef i Luiz svi imaju naloge na GitHub-u, i želite da im date pristup za guranje na vaš repozitorijum, možete da ih dodate na svoj projekat. To će im dati pristup za guranje, što znači da će moći i da čitaju podatke i da ih pišu na projektu i na Git repozitorijumu.

Kliknite na link Settings na dnu trake sa desne strane.

Link za podešavanje repozitorijuma.
Figure 113. Link za podešavanje repozitorijuma

Onda odaberite Collaborators iz menija sa leve strane. Zatim samo ukucajte korisničko ime u polje za unos, i kliknite Add collaborator. Ovo možete da ponovote onoliko puta koliko je potrebno da biste dali pristup svima kome želite. Ako treba da opozovete pristup, samo kliknite na X sa desne strane odgovorajućeg reda.

Kolaboratori repozitorijuma.
Figure 114. Kolaboratori repozitorijuma.

Upravljenje zahtevima za povlačenjem

Sada kada imate projekat sa nekim kodom i možda čak nekoliko kolaboratora koji imaju pristup guranju promena, hajde da vidimo šta da radite kada dobijete zahtev za povlačenjem.

Zahtevi za povlačenjem mogu da dođu ili sa grane u forku vašeg repozitorijuma ili da dođu sa druge grane iz istog repozitorijuma. Jedina razlika je u tome što oni iz forka obično pripadaju drugim ljudima gde ne možete da gurnete na njihovu granu i oni ne mogu na vašu, dok kod internih zahteva za povlačenjem u opštem slučaju oba lica imaju pristup grani.

Za ove primere, pretpostavićemo da ste vi tonychacon i da ste napravili novi projekat sa Arduino kodom koji se zove fade.

Mejl obaveštenja

Neko dođe, napravi promene u kodu i pošalje vam zahtev za povlačenjem. Treba da dobijete mejl koji vas obaštava o novom zahtevu za povlačenjem i trebalo bi da izgleda nešto kao Obaveštenje o novom zahtevu za povlačenjem putem mejla..

Obaveštenje o novom zahtevu za povlačenjem putem mejla.
Figure 115. Obaveštenje o novom zahtevu za povlačenjem putem mejla.

Postoji nekoliko stvar koje treba da primetite u ovom mejlu. Daje vam kratku statistiku o razlikama — listu fajlova koje su se promenile u zahtevu za povlačenjem i za koliko. Daje vam link ka zahtevu za povlačenjem na GitHub-u. Daje vam i nekoliko URL-ova koje možete da iskoristite iz komandne linije.

Ako primetite liniju gde kaže git pull <url> patch-1, ovo je jednostavan način da se spojite na udaljenu granu a da ne dodajete ručno rimout. Brzo smo prešli ovo u Čekautovanje udaljenih grana. Ako želite, možete da kreirate i skočite na tematsku granu i onda pokrenete ovu komandu da spojite promene sa zahteva za povlačenjem.

Drugi zanimljivi URL-ovi su .diff i .patch, koji, kao što možete da pretpostavite, daju ujedinjenu razliku i zakrpa-verzije zahteva za povlačenjem. Tehnički možete da spojite zahtev za povlačenjem nekako ovako:

$ curl http://github.com/tonychacon/fade/pull/1.patch | git am

Kolaboracija na zahtevu za povlačenjem

Kako smo pokrili u Tok u GitHub-u, sada možete da porazgovarate sa osobom koja je otvorila zahtev za povlačenjem. Možete da komentarišete na specifične linije koda, da komentarišete cele komitove ili pak na čitav zahtev za povlačenjem, koristeći GitHub-ovu Markdaun sintaksu.

Svaki put kada neko drugi komentariše na zahtev za povlačenjem, dobićete obaveštenjem putem mejla kako biste znali da se dešava aktivnost. Svaki od njih će imati link na zahtevu za povlačenjem gde se aktivnost događa, a možete i da ukucate odgovor direktno u mejlu i tako objavite svoj komentar.

Email response
Figure 116. Responses to emails are included in the thread.

Kada kôd bude sređen i kada poželite da spojite, možete ili da povučete kôd i spojite ga lokalno, ili da iskoristite git pull <url> <branch> sintaksu koju smo videli ranije, ili da dodate fork kao rimout i onda pribavite promene sa njega i spojite.

Ako je spoj trivijalan, možete i samo da pritisnete dugme Merge na GitHub vebsajtu. Ovo će uraditi "ne motaj napred" spoj, što znači da će napraviti spojni komit čak i ako je spoj motanjem napred moguć. Ovo znači da će nastati novi spojni komit uvek kada pristisnete Merge dugme. Kao što vidite u Dugme Merge i instrukcije za spajanje zahteva za povlačenjem ručno., GitHub vam daje sve ove inforamcije ako kliknete na hint link.

Dugme _Merge_ i instrukcije za spajanje zahteva za povlačenjem ručno
Figure 117. Dugme Merge i instrukcije za spajanje zahteva za povlačenjem ručno.

Ako ste odlučili da ne želite da spojite, možete i da samo zatvorite zahtev za povlačenjem i osoba koja ga je otvorila će biti obaveštena.

Reovi za zahtev za povlačenjem

Ako baratate sa puno zahteva za povlačenjem i ne želite da dodate gomilu rimoutova ili da svaki put obrađujete jedan po jedan zahtev, postoji jedan dobar trik koji vam GitHub nudi. Ovo je pomalo napredniji trik i obradićemo detalje kada malo više budemo govorili o tome u Refspek, ali može da bude jako koristan.

GitHub zapravo oglašava grane koje su zahtev za povlačenjem za repozitoijum kao vrstu pseudo-grane na serveru. Po podrazumevanim podešavanjima ne dobijate ih kada napravite klon, ali su tu na opskurantan način i možete da im pristupite jednostavno.

Da bismo demonstrirali ovo, koristićemo komandu niskog nivoa (često se koristi termin "plambing" komanda, o čemu ćete više pročitati u Vodovod i porcelan) koja se zove ls-remote. Ova komanda se generalno ne koristi u svakodnevnim Git operacijama ali je korisna da nam pokaže koje reference postoje na serveru.

Ako pokrenemo komandu spram "blink" repozitorijuma koji smo ranije koristili, dobićemo listu svih grana i tagova i drugih referenci u repozitorijumu.

$ git ls-remote https://github.com/schacon/blink
10d539600d86723087810ec636870a504f4fee4d	HEAD
10d539600d86723087810ec636870a504f4fee4d	refs/heads/master
6a83107c62950be9453aac297bb0193fd743cd6e	refs/pull/1/head
afe83c2d1a70674c9505cc1d8b7d380d5e076ed3	refs/pull/1/merge
3c8d735ee16296c242be7a9742ebfbc2665adec1	refs/pull/2/head
15c9f4f80973a2758462ab2066b6ad9fe8dcf03d	refs/pull/2/merge
a5a7751a33b7e86c5e9bb07b26001bb17d775d1a	refs/pull/4/head
31a45fc257e8433c8d8804e3e848cf61c9d3166c	refs/pull/4/merge

Naravno, ako ste u svom repozitorijumu i pokrenete git ls-remote origin ili koji god rimout želite da proverite, pokazaće vam nešto slično ovome.

Ako je repozitorijum hostovan na GitHub’u i imate otvorene zahteve za povlačenjem , dobićete reference sa prefiksom refs/pull/. Ovo su u suštini grane, ali pošto nisu pod refs/heads/ ne dobijate ih kada klonirate ili pribavite podatke sa servera — proces pribavljanja ih obično ignoriše.

Postoje dve reference za svaki zahtev za povlačenjem — ona koja se završava sa /head pokazuje na isti komit kao i poslednji komit u grani zahteva za povlačenjem. Zato, ako neko otvori zahtev za povlačenjem u našem repozitorijumu i njihova grana se zove bug-fix i pokazuje na komit a5a775, onda u našem repozitorijumu nećemo imati granu bug-fix (oišto je ona u njihovom forku), ali hoćemo imati pull/<pr#>/head koja pokazuje na a5a775. Ovo znači da možemo dosta lako da povučemo svaku granu zahteva za povlačenjem a da ne dodajemo gomilu rimoutova.

Sada, možete da uradite nešto kao pribavljanje reference direktno.

$ git fetch origin refs/pull/958/head
From https://github.com/libgit2/libgit2
 * branch            refs/pull/958/head -> FETCH_HEAD

Ovo govori Gitu, "Poveži se na origin rimout, i preuzmi ref sa imenom refs/pull/958/head." Git vas sa zadovoljstvom sluša i preuzima sve što vam treba da konstruišete taj ref, i stavlja pokazivač na komit koji želite pod .git/FETCH_HEAD. Možete to da ispratite sa git merge FETCH_HEAD u granu u koju želite da testirate, ali ta poruka spojnog komita izgleda pomalo čudno. Takođe, ako razmatrate mnogo zahteva za povlačenjem, ovo postaje dosadno.

Postoji način da pribavite sve zahteve za povlačenjem, i da ih održite aktuelnim svaki put kada se povežete na rimout. Otvorite .git/config u svom omiljenom editoru i potražite origin rimout. Treba da izgleda nekako ovako:

[remote "origin"]
    url = https://github.com/libgit2/libgit2
    fetch = +refs/heads/*:refs/remotes/origin/*

Linija koja počinje sa fetch = je "refspek". To je način na koji se mapiraju imena na rimoutu sa imenima u lokalnom .git direktorijumu. Ova linija govori Gitu, "stvari na rimoutu pod refs/heads treba da idu u moj lokalni repozitorijum pod refs/remotes/origin". Možete da modifikujete ovaj odeljak da dodate druge refspekove:

[remote "origin"]
    url = https://github.com/libgit2/libgit2.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

Poslednja linija kaže Gitu, "Svi refovi koji izgledaju kao refs/pull/123/head treba da se lokalno smeste pod refs/remotes/origin/pr&123". Sada, ako sačuvate taj fajl, i uradite git fetch:

$ git fetch
# …
 * [new ref]         refs/pull/1/head -> origin/pr/1
 * [new ref]         refs/pull/2/head -> origin/pr/2
 * [new ref]         refs/pull/4/head -> origin/pr/4
# …

Sada se svi udaljeni zahtevi za povlačenjem predstavljaju lokalno pomoću refova otprilike kao praćenje grana; moguće ih je samo čitati, i ažuriraju se kada obavite pribavljanje. Ovako je super-jednostavno da isprobate kôd sa zahteva za spajanejm lokalno:

$ git checkout pr/2
Checking out files: 100% (3769/3769), done.
Branch pr/2 set up to track remote branch pr/2 from origin.
Switched to a new branch 'pr/2'

Oni koji imaju oko sokolovo primetiće da je head na kraju rimouta deo refspeka. Postoji i refs/pull/#/merge ref na GitHub’ovoj strani, što predstavlja komit koji bi nastao ako pritisnete merge dugme na sajtu. Ovo vam omogućava da testirate spoj pre nego što uopšte pritisnete dugme.

Zahtevi za povlačenjem na zahtevima za povlačenjem

Možete da otvarate zahteve za povlačenjem koji kao odredište imaju glavnu ili master granu, ali možete i da ih otvorite za bilo koju drugu granu na mreži. Zapravo, odredište može biti i drugi zahtev za povlačenjem.

Ako vidite zahtev za povlačenjem koji ide u dobrom pravcu i imate ideju za promenu koja zavisi od njega ili nista sigurni da li to dobra ideja, ili jednostavno nemate pristup guranju izmena na odredišnoj grani, možete da otvorite zahtev za povlačenjem dirketno na njega.

Kada otvorite zahtev za povlačenjem, pojaviće se kutija na vrhu strane koja specificira ka kojoj grani želite da budete povučeni i od koje zahtevate da povučete. Ako pritisnete dugme Edit sa desne strane kutije, možete da promenite ne samo grane već i fork.

Manuelna promena odredišnog forka i odredišne grane zahteva za povlačenjem
Figure 118. Manuelna promena odredišnog forka i odredišne grane zahteva za povlačenjem.

Ovde prilično lako možete da spojite svoju novu granu u drugi zahtev za povlačenjem ili drugi fork projekta.

Pominjanje i obaveštenja

GitHub ima ugrađeen prilično dobar sistem obaveštenja koji je koristan kada imate pitanja ili vam treba povratna inforamcija od određenih osoba ili celog tima.

U bilo kom komentaru možete da ukucate karater @ i automatski će vam izlistati imena i korisnička imena ljudi koji su kolaboratori ili kontributori na projektu.

Počnite da kucate `@` da biste pomenuli nekog
Figure 119. Počnite da kucate @ da biste pomenuli nekog.

Možete da pomenete i korisnika koji nije na listi, ali autokomplit obično čini stvari bržim.

Kada objavite komentar u kome pominjete korisnika, on ili ona će biti obavešteni. Ovo znači da ovo može biti veoma efikasan način pozivanja ljudi u razgovore. Ljudi na GitHub-u će često pozivati druge ljude iz tima da recenziraju zahteve za povlačenjem ili tikete.

Ako neko bude pomenut na zahtevu za povlačenjem ili tiketu, biće "pretplaćeni" i nastaviće da dobijaju notifikacije svaki put kada se dogodi neka aktivnost. Bićete pretplaćeni i na sve što sami otvorite, ako nadgledate (watch) repozitorijum ili ako komentarišete na nešto. Ako više ne želite da dobijate obaštenja, na stranici postoji dugme Unsubscribe na koje možete kliknuti i prestaćete da dobijate obaveštenja.

Unsubscribe
Figure 120. Prestanak praćenja zahtevâ za povlačenjem ili tiketâ.

Stranica sa obaveštenjima

Kada kažemo "obaveštenje" u kontekstu GitHub-a, mislimo na specifičan način pomoću koga GitHub pokušava da stupi u kontakt sa vama kada se dogode dođaji i postoji nekoliko različitih načina da ih konfigurišete. Ako odete na tab Notification center sa stranice za podešavanja, videćete neke od opcija koje imate.

Notification center
Figure 121. Opcije u centru za notifikacije.

Postoje dva izbora: dobijanje obaveštenja putem mejla ili putem veba i možete da izaberete jedno od njih, nijedno od njih ili oba kada aktivno učestvujete u stvarima i za aktivnosti na repozitorijumima koje nadgledate.

Veb obaveštenja

Veb obaveštenja postoje samo na GitHub-u i možete da ih pogledate samo na GitHub-u. Ako vam je ova opcija selektirana u preferencama i okine se obaveštenje koje vam stigne, dobićete malu plavu tačku preko ikonice za obaveštenja u gornjem delu ekrana kao što se vidi na Centar za obaveštenja..

Centar za obaveštenja
Figure 122. Centar za obaveštenja.

Ako kliknete tu, videćete listu svih stavki o kojima ste obavešteni, grupisanu po projektima. Možete da filtrirate obaveštanja po određenom projektu tako što ćete kliknuti na njegovo ime u traci sa leve strane. Možete i da potvrdite obaveštenje tako što ćete kliknuti na ikonicu za štikliranje pored bilo kog obaveštenja, ili da potvrdite sva obaveštenja u projektu tako što ćete klikinuti na ikonicu za štikliranje na vrhu grupe. Postoji i dugme za utišavanje obaveštenja pored svake ikonice za štikliranje na koje možete da kliknete ukoliko ne želite da dobijate dalja obaštenja u vezi s tom stavkom.

Svi ovi alati su veoma korisni za rukovanje velikim brojem obaveštenja. Mnogi iskusni korisnici će jednostavno ugasiti obaveštenja putem mejla u potpunosti i upravljati svim obaveštenjima preko ovog ekrana.

Obaveštenja putem mejla

Obaveštenja putem mejla su još jedan način da rukujete obaveštenjima na GitHub-u. Ako vam je ova opcija uključena, dobijaćete mejl za svaku notifikaciju. Videli smo primer ovoga u Komentari poslati kao mejl notifikacije. i Obaveštenje o novom zahtevu za povlačenjem putem mejla.. Mejlovi će se i namotavati kako valja, što je lepo ako koristite klijent koji podržava ovaj vid pregleda mejlova.

Postoji i poštena količina metapodataka ugrađena u zaglavlja mejlova koje vam GitHub šalje, što može da bude veoma korisno ako postavljate personalizovane filtere i pravila.

Na primer, ako pogledamo zaglavlja mejlova koji su poslati Toniju u mejlu koji je prikazan u Obaveštenje o novom zahtevu za povlačenjem putem mejla., videćemo sledeće među ostalim informacijama:

To: tonychacon/fade <fade@noreply.github.com>
Message-ID: <tonychacon/fade/pull/1@github.com>
Subject: [fade] Wait longer to see the dimming effect better (#1)
X-GitHub-Recipient: tonychacon
List-ID: tonychacon/fade <fade.tonychacon.github.com>
List-Archive: https://github.com/tonychacon/fade
List-Post: <mailto:reply+i-4XXX@reply.github.com>
List-Unsubscribe: <mailto:unsub+i-XXX@reply.github.com>,...
X-GitHub-Recipient-Address: tchacon@example.com

Ovde ima nekoliko zanimljivih stvari. Ako želite da istaknete ili preusmerite mejlove za ovaj određeni projekat ili čak za zahtev za povlačenjem, informacija u Message-ID vam daje sve podatke u formatu <korisnik>/<projekat>/<vrsta>/<id>. Na primer, da je ovo bio tiket, u polju <type> bi pisalo issues umesto pull.

Polja List-Pos i List-Unsubscribe znače da ako imate klijent za mejl koji razume ovo, možete lako da postujete na listu ili da ukinete pretplatu sa teme. To bi bilo isto kao klik na dugme Mute na veb verziji obaveštenjea ili Unsubscribe na samoj stranici zahteva za povlačenjem ili tiketa.

Takođe vredi napomenuti da ako imate uključena i mejl i veb obaveštenja i pročitate mejl verziju obaveštenja, veb verzija će biti označena kao pročitana takođe, ako su slike dozvoljene u vašem mejl klijentu.

Posebni fajlovi

Ima nekoliko posebnih fajlova koje će GitHub primetiti ako postoje u repozitorijumu.

README

Prvi je fajl README koji može biti u skoro svakom formatu koji GitHub prepoznaje kao prozu. Na primer, može da bude README, README.md, README.asciidoc, itd. Ako GitHub vidi README fajl u vašem izvornom kodu, renderovaće ga na početnoj stranici projekta.

Mnogi timovi koriste ovaj fajl da zapišu sve relevantne informacije o projektu za nekog ko je možda nov na repozitorijumu ili projektu. Obično se ovde pišu stvari kao:

  • Čemu je projekat namenjen

  • Kako ga konfigurisati i instalirati

  • Primer koji pokazuje kako se koristi

  • Licenca pod kojom je projekat dostupan

  • Kako mu doprineti

Pošto će GitHub renderovati ovaj fajl, možete da ugradite slike ili linkove da bi dokument bio razumljiviji.

CONTRIBUTING

Drugi poseban fajl koji GitHub prepoznaje je fajl CONTRIBUTING. Ako imate fajl CONTRIBUTING sa bilo kojom ekstenzijom, GitHub će prikazati Otvaranje zahteva za povlačenjem kada postoji fajl CONTRIBUTING. kad god neko otvori zahtev za povlačenjem.

Beleška o doprinošenju
Figure 123. Otvaranje zahteva za povlačenjem kada postoji fajl CONTRIBUTING.

Ideja je da specificirate određene stvari koje želite ili ne želite da budu uključene u zahtev za povlačenjem za vaš projekat. Na ovaj način ljudi će zapravo možda i pročitati smernice pre nego što otvore zahtev za povlačenjem.

Admistracija projekta

Generalno nema mnogo administrativnih stvari koje možete da radite sa jednom projektom, ali postoji nekoliko stavki koje bi možda bile od interesovanja.

Menjanje podrazumevane grane

Ako koristite neku granu koja nije master kao podrazumevanu granu nad kojom želite da ljudi otvaraju zahteve za povlačenjem ili da je podrazumevano vide, možete to da promenite u podešavanjima repozitorijuma u tabu Options.

Podrazumevana grana
Figure 124. Promena podrazumevane grane za projekat.

Jednostavno promenite podrazumevanu granu u padajućem meniju i to će biti podrazumevana grana za sve veće operacije od tada pa nadalje, uključujući i to koja grana će se čekautovati po podrazumevanim podešavanjima kada neko klonira repozitorijum.

Prenos projekta

Ako biste želeli da svoj projekat preneste drugom korisniku ili organizaciji na GitHub-u, postoji opcija Transfer ownership na dnu istog taba Options na stranici sa podešavanjima vašeg repozitorijuma koja vam ovo omogućava.

Prenos
Figure 125. Prenos projekta drugom korisniku GitHub-a ili organizaciji.

Ovo je korisno ako napuštate projekat i neko drugi želi da ga preuzme, ili vam projekat postaje sve veći i želite da ga premestite u organizaciju.

Ovo ne samo da premešta repozitorijum zajedno sa svim pratiocima i zvezdama na drugo mesto, već podešava i preusmeravanje sa vašeg URL-a na novi. Preusmeravanje će raditi i prilikom kloniranja i pribavljanja iz Gita, ne samo na veb zahtevima.