Git
Chapters ▾ 2nd Edition

2.5 Основи на Git - Работа с отдалечени хранилища

Работа с отдалечени хранилища

За да можете да сътрудничите в Git проекти, трябва да знаете как да управлявате отдалечените си хранилища. Отдалечените хранилища са версии на вашия проект, които се съхраняват някъде в корпоративната мрежа или в Интернет. Може да имате много от тях, като всяко от хранилищата може да е с права за вас само за четене или за четене/писане. Сътрудничеството с други разработчици изисква управление на тези отдалечени хранилища и издърпване/изпращане на данни от/към тях когато трябва да споделите работата си. Управлението на отдалечени хранилища включва умения за това как да добавяте такива, да премахвате хранилища, които вече не са валидни, управление на разнообразни отдалечени клонове код и дефинирането им като следени (tracked) или не и т.н. В тази секция разглеждаме някои от тези неща.

Note
Отдалечени хранилища могат да присъстват на локалната ви машина.

Напълно възможно е да работите с “отдалечено” хранилище, което в действителност се намира на същия хост. Думата “отдалечено” не означава непременно, че хранилището е някъде другаде в мрежата или в Интернет, тя означава че то просто е другаде. Работата с подобно хранилище все още си изисква всичките стандартни push/pull/fetch операции.

Показване на отдалечените хранилища

За да видите кои отдалечени сървъри имате конфигурирани, използвайте командата git remote. Тя отпечатва съкратените имена на всяко отдалечено хранилище, което сте указали. Ако сте клонирали отдалечено хранилище, трябва да видите в списъка поне елемента origin — това е подразбиращото се име, което Git дава на сървъра, от който сте клонирали:

$ 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

Можете да ползвате и флага -v, който показва пълния URL, който Git пази за съответното кратко име на отдалеченото хранилище:

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

Ако имате повече от едно отдалечено хранилище, командата показва всички тях. Например, хранилище с много отдалечени копия за работа с няколко сътрудника, би могло да изглежда така.

$ 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)

Това означава, че можем да издърпваме работата от всеки от тези потребители доста лесно. Може освен това да имаме права да изпращаме наш код към едно или повече от копията, въпреки че това не става ясно от тук.

Отбележете също, че тези отдалечени копия използват различни протоколи, ще обърнем повече внимание на това в Достъп до Git на сървъра.

Добавяне на отдалечени хранилища

Вече показахме как командата git clone самичка създава origin отдалеченото хранилище за вас. Ето как да си добавите изрично отдалечено хранилище. Командата git remote add <shortname> <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)

Сега вече можете да ползвате краткото име pb, вместо целия отдалечен URL. Например, ако искате да издърпате цялата информация, която Paul има, но все още не е в локалното ви хранилище, можете да използвате командата 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

Сега master-клонът на Paul е достъпен локално за вас като pb/master — можете да го слеете в някой от вашите клонове код или да превключите към него, ако желаете да го прегледате. (Ще разгледаме подробно какво са клоновете код и как да ги използваме в Клонове в Git.)

Fetching и Pulling на данни от отдалечени хранилища

Както току що видяхте, извличането на данни от отдалечен проект се прави с:

$ git fetch <remote>

Командата се свързва с отдалечения сървър и изтегля всички данни за него, които все още нямате локално. След като направите това, ще имате указатели към всички клонове код на това отдалечено хранилище, така че да можете да ги инспектирате и слеете с локалните си клонове по всяко време.

Ако клонирате хранилище, командата git clone автоматично го добавя като отдалечено под съкратеното име “origin”. Така че, git fetch origin изтегля всички нови данни от това хранилище, които са били добавени след като сте го клонирали (или последно актуализирали). Важно е да се отбележи, че git fetch само изтегля информацията в локалната ви база данни — тя не прави автоматично сливане с каквато и да било част от локалната ви работа и по никакъв начин не модифицира локалните файлове. Вие сами трябва да направите това ръчно, когато сте готови.

Ако текущият ви клон код (branch) е настроен да проследява отдалечен клон (вижте следващата секция и Клонове в Git за повече информация), можете да използвате командата git pull за автоматично изтегляне и сливане на данните от отдалечения клон в локалния. Това може да е по-лесно и по-удобно за вас като работна последователност и по подразбиране, git clone автоматично настройва локалния ви master branch да следи отдалечения master branch от сървъра, от който сте клонирали (или както се казва клонът по подразбиране на него). Така че git pull изтегля данните от сървъра, от който сте клонирали и автоматично се опитва да ги слее с кода, върху който работите в момента, спестявайки ви една ръчна стъпка по сливането.

Изпращане на данни към отдалечено хранилище

Когато работата ви стигне до статус, в който искате да я публикувате с другите разработчици от даден проект, можете да изпратите промените си към главното хранилище. Командата за това е проста: git push <remote> <branch>. Ако искате да публикувате промените си от локалния master клон към origin сървъра (да кажем отново, клонирането обикновено настройва и двете кратки имена за вас автоматично), можете да изпълните следното:

$ git push origin master

Тази команда работи само ако, сте клонирали хранилището от отдалечен сървър, ако имате права за писане в него и ако никой междувременно не е изпратил към него нещо преди вас. Ако вие и някой друг сте клонирали едно и също хранилище и ако другият е изпратил обратно данни преди вас, то вашето изпращане правилно ще бъде отказано. Ще трябва първо да изтеглите работата на другия колега, да я слеете в локалното си копие и след това ще можете да изпратите към отдалечения сървър. Вижте Клонове в Git за повече подробности относно това как да изпращате към отдалечен сървър.

Преглед на отдалечено хранилище

Ако желаете повече информация за отдалечено хранилище, ползвайте командата git remote show <remote>. Ако я изпълните с определено кратко име като origin например, ще видите следното:

$ 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)

Показва се адреса на отдалеченото хранилище, както и информация за проследяването на клоновете. Командата подсказва, че ако сте в локалния master клон и изпълните git pull, това автоматично ще го слее с промените в отдалеченoто хранилище след изтеглянето на всички отдалечени референции. Тя също така отпечатва и всички отдалечени референции, които са издърпани.

Това е прост пример, който е вероятно да срещнете. Когато ползвате Git по-интензивно обаче, може да видите и доста повече данни от 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)

Тази команда показва към кой отдалечен клон ще се изпращат вашите промени, когато изпълните git push докато сте в определен локален клон. Тя още ви показва отдалечените клонове на сървъра, които вие все още нямате локално при вас, локално съхранените от преди клонове, които вече не съществуват на сървъра, и множество локални клонове, които могат да се слеят автоматично със съответните си отдалечени такива (които следят) при изпълнение на git pull.

Премахване и преименуване на отдалечени хранилища

Използвайте git remote rename за смяна на краткото име на отдалечено хранилище. Например, ако искате да смените името на pb с paul:

$ git remote rename pb paul
$ git remote
origin
paul

Това също променя и имената, под които се показват отдалечените проследявани клонове. Този, който преди се казваше pb/master сега е paul/master.

Ако по някаква причина искате да премахнете отдалечено хранилище, например сменили сте сървъра или пък някое от огледалата или пък определен сътрудник не участва повече в проекта — можете да използвате командите git remote remove или git remote rm:

$ git remote remove paul
$ git remote
origin

Веднъж след като премахнете референция към отдалечено хранилище по този начин, всички remote-tracking клонове и конфигурационни настройки асоциирани с него, също се премахват.