Git
Chapters ▾ 2nd Edition

2.5 Osnove Gita - Rad sa udaljenim repozitorijumima

Rad sa udaljenim repozitorijumima

Da biste mogli da kolaborirate na bilo kom Git projektu, morate da naučite kako da ogranizujete udaljene repozitorijume (remote repositories, često samo remotes). Udaljeni repozitorijumi su verzije projekta koje su hostovane na internetu ili negde na mreži. Možete ih imati nekoliko, od kojih vam je svaki u opštem slučaju ili dostupan samo za čitanje (read-only) ili i za čitanje i za upis (read/write). Kolaboracija sa drugima podrazumeva upravljanje tim udaljenim repozitorijumima i guranje (push) i povlačenje (pull) podataka kada je potrebno podeliti rad. Pod upravljanjem udaljenim repozitorijumima smatra se dodavanje udaljenog repozitorijuma, uklanjanje onih koji više nisu validni, upravljanje raznim udaljenim granama i njihovo definisanje kao praćene ili nepraćene, i još toga. U ovom odeljku ćemo preći neke od ovih stavki.

Prikaz udaljenih repozitorijuma

Da biste videli koje udaljene servere imate konfigurisane, možete da pokrenete komandu git remote. Ona će izlistati skraćena imena svih udaljenih repozitorijuma koje ste specificirali. Ako ste klonirali repozitorijum, trebalo bi da barem vidite origin - to je podrazumevano ime koje Git daje serveru sa koga ste klonirali.

$ git clone https://github.com/schacon/ticgit
Cloning into 'ticgit'...
remote: Reusing existing pack: 1857, done.
remote: Total 1857 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (1857/1857), 374.35 KiB | 268.00 KiB/s, done.
Resolving deltas: 100% (772/772), done.
Checking connectivity... done.
$ cd ticgit
$ git remote
origin

Možete da specificirate i -v, što će pokazati URL-ove koje je Git uskladištio za kratko ime koje se koristi kada se čita i piše po tom udaljenom repozitorijumu:

$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)

Ako imate više od jednog udaljenog repozitorijuma, ova komanda će ih sve izlistati. Na primer, repozitorijum sa više rimoutova za rad sa nekoliko kolaboratora bi mogao da izgleda ovako.

$ cd grit
$ git remote -v
bakkdoor  https://github.com/bakkdoor/grit (fetch)
bakkdoor  https://github.com/bakkdoor/grit (push)
cho45     https://github.com/cho45/grit (fetch)
cho45     https://github.com/cho45/grit (push)
defunkt   https://github.com/defunkt/grit (fetch)
defunkt   https://github.com/defunkt/grit (push)
koke      git://github.com/koke/grit.git (fetch)
koke      git://github.com/koke/grit.git (push)
origin    git@github.com:mojombo/grit.git (fetch)
origin    git@github.com:mojombo/grit.git (push)

Ovo znači da možemo da povučemo doprinos od bilo kog od ovih korisnika prilično jednostavno. Možda dodatno imamo i dozvolu da šaljemo jednom ili više njih, mada to ne možemo da vidimo odavde.

Obratite pažnju na to kako udaljeni repozitorijumi koriste razne protokole; o ovome ćemo detaljnije pričati u Git on the Server.

Dodavanje udaljenih repozitorijuma

Pomenuli smo i demonstrirali dodavanje udaljenih repozitorijuma u prethodnim sekcijama, ali evo kako se to eksplicitno radi. Da biste dodali novi udaljeni Git repozitorijum kao kratko ime na koje ćete kasnije lako moći da se pozovete, pokrenite git remote add <kratko_ime> <url>:

$ git remote
origin
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin	https://github.com/schacon/ticgit (fetch)
origin	https://github.com/schacon/ticgit (push)
pb	https://github.com/paulboone/ticgit (fetch)
pb	https://github.com/paulboone/ticgit (push)

Sada možete da koristite pb u komandnoj liniji umesto velikog URL-a. Na primer, ako hoćete da pribavite sve informacije koje Pol ima ali vi još nemate u svom repozitorijumu, možete da pokrenete git fetch pb:

$ git fetch pb
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 43 (delta 10), reused 31 (delta 5)
Unpacking objects: 100% (43/43), done.
From https://github.com/paulboone/ticgit
 * [new branch]      master     -> pb/master
 * [new branch]      ticgit     -> pb/ticgit

Polova master grana je sada pristupna lokalno u pb/master — možete da je spojite sa nekom vašom granom, ili da čekautujete lokalnu granu ako želite da je detaljnije pregledate. (Mnogo detaljnije ćemo se pozabaviti time šta su tačno grane i kako se koriste u Grananje u Gitu.)

Pribavljanje i povlačenje iz udaljenih repozitorijuma

Kao što ste upravo videli, podatke iz udaljenih projekata dobijate tako što pokrenete

$ git fetch <ime-udaljenog-repozitorijuma>

Komanda odlazi do tog udaljenog projekta i povlači sve podatke sa njega koje još uvek nemate. Nakon što uradite ovo, treba da imate reference na sve grane iz tog udaljenog repozitorijuma, koje možete da spojite sa svojim ili da ih istražite u bilo kom trenutku.

Ako klonirate repozitorijum, komanda automatski dodaje taj udaljeni repozitorijum pod imenom origin. Dakle, git fetch origin pribavlja sav novi rad koji je poslat ka tom serveru otkad ste ga klonirali (ili pribavili nešto s njega). Bitno je napomenuti da komanda git fetch povlači podatke u vaš lokalni repozitorijum - ne spaja ih automatski sa vašim radom niti modifikuje ono na čemu trenutno radite. Morate da ih spojite ručno kada budete spremni.

Ako imate granu koja je podešena tako da prati udaljenu granu (pogledajte sledeći odeljak i Grananje u Gitu za više informacija), možete da iskoristite git pull da automatski pribavite i onda spojite udaljenu granu u vašu trenutnu granu. Ovo je možda jednostavniji ili udobniji tok rada za vas; i po podrazumevanim podešavanjima, git clone komanda automatski postavlja lokalnu master granu da prati udaljenu master granu (ili kako god se zove podrazumevana grana) na serveru sa kojeg ste klonirali. Pokretanje git pull u opštem slučaju pribavlja podatke sa servera sa kog ste prvobitno klonirali i automatski pokušava da spoji u njega kod na kome trenutno radite.

Guranje ka udaljenim repozitorijumima

Kada vaš projekat dosegne stanje u kojem poželite da ga podelite, morate da ga pogurate uzvodno. Komanda za ovo je prosta: git push [ime-rimouta] [ime-grane]. Ako želite da pošaljete na master granu vašem origin serveru (opet, kloniranje u opštem slučaju postavlja oba ova imena automatski), onda možete da pokrenete ovo da pošaljete sve komitove koje ste uradili na serveru:

$ git push origin master

Ova komanda radi samo ako ste klonirali sa servera ka kojem imate pristup pisanja i ako niko nije slao podatke u međuvremenu. Ako zajedno sa nekim istovremeno klonirate i onda on ili ona pošalje izmene a zatim vi pošaljete svoje, vaša izmena će biti odbijena s pravom. Moraćete da najpre povučete njegov ili njen rad i da ga inkorporišete u svoj pre nego što vam bude dozvoljeno da pošaljete bilo šta. Pogledajte Grananje u Gitu za detaljnije objašnjenje o tome kako se šalje na udaljene servere.

Istraživanje udaljenog repozitorijuma

Ako želite da vidite više informacija o određenom udaljenom repozitorijumu, možete da iskoristite git remote show [ime-rimouta] komandu. Ako ovo pokrenete sa određenim kratkim imenom, kao što je origin, dobićete nešto ovako.

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

To će izlistati URL-ove za udaljene repozitorijume kao i informaciju o praćenim granama. Komanda vam čini uslugu time što vam kaže da ako ste na master grani i ako pokrenete git pull, automatski će se spojiti u master granu na udaljenom repozitorijumu nakon što pribavi sve udaljene reference. U listi se takođe nalaze i udaljene reference koje su povučene.

To je prost primer na koji ćete verovatno naići. Kada malo ozbiljnije počnete da koristite Git, međutim, videćete mnogo više informacija zvanjem git remote show:

$ git remote show origin
* remote origin
  URL: https://github.com/my-org/complex-project
  Fetch URL: https://github.com/my-org/complex-project
  Push  URL: https://github.com/my-org/complex-project
  HEAD branch: master
  Remote branches:
    master                           tracked
    dev-branch                       tracked
    markdown-strip                   tracked
    issue-43                         new (next fetch will store in remotes/origin)
    issue-45                         new (next fetch will store in remotes/origin)
    refs/remotes/origin/issue-11     stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    dev-branch merges with remote dev-branch
    master     merges with remote master
  Local refs configured for 'git push':
    dev-branch                     pushes to dev-branch                     (up to date)
    markdown-strip                 pushes to markdown-strip                 (up to date)
    master                         pushes to master                         (up to date)

Ova komanda pokazuje koja grana je automatski poslata vama kada ste pokrenuli git push dok ste na određenim granama. Takođe vam pokazuje i koje udaljene grane na serveru još uvek nemate, koje udaljene grane imate koje su uklonjene sa severa, i više lokalnih grana koje mogu da se automatski spoje sa odgovarajućim pratećim granama kad pokrenete git pull.

Uklanjanje i promena imena udaljenim repozitorijumima

Ako želite da preimenujete referencu možete da pokrenete git remote rename da promenite kratko ime udaljenom repozitorijumu. Na primer, ako želite da pb preimenujete u paul, to možete uraditi pomoću naredbe git remote rename:

$ git remote rename pb paul
$ git remote
origin
paul

Vredi napomenuti da ovo menja i imena vašim udaljenim granama. Ono što je ranije bilo referencirano sa pb/master se sada nalazi na paul/master.

Ako želite da uklonite udaljeni repozitorijum iz nekog razloga — pomerili ste server ili više ne koristite neki miror, ili možda kontributor više ne kontribuira — možete da iskoristite git remote rm:

$ git remote rm paul
$ git remote
origin