Git
Chapters ▾ 2nd Edition

10.5 Гит изнутра - Рефспек

Рефспек

Кроз ову књигу смо користили једноставна мапирања из удаљених грана на локалне референце, али она могу бити и сложенија. Претпоставимо да сте пратили неколико последњег одељака и креирали мали локални Гит репозиторијум, па сада желите да му додате remote (удаљени репозиторијум):

$ git remote add origin https://github.com/schacon/simplegit-progit

Извршавање ове команде додаје одељак у .git/config фајлу вашег репозиторијума, са наведеним именом удаљеног репозиторијума (origin), његовом URL адресом и рефспек (спецификацију референце) који ће се користити за преузимање:

[remote "origin"]
	url = https://github.com/schacon/simplegit-progit
	fetch = +refs/heads/*:refs/remotes/origin/*

Формат рефспека је прво необавезни + за којим следи <изв>:<одр>, где је <изв> шаблон за референце на удаљеној страни, а <одр> је место на којем ће се те референце пратити локално. Знак + говори програму Гит да ажурира референцу чак и ако није у питању премотавање унапред.

У подразумеваном случају који аутоматски уписује команда git remote add, програм Гит преузима све референце под refs/heads/ на серверу и пише их локално у refs/remotes/origin/. Дакле, ако на серверу постоји master грана, локално можете да приступите њеном логу на било који од следећих начина:

$ git log origin/master
$ git log remotes/origin/master
$ git log refs/remotes/origin/master

Сви су еквивалентни, јер их програм Гит развија на refs/remotes/origin/master.

Ако уместо тога желите да програм Гит сваки пут довуче само master грану, а не и сваку другу грану са удаљеног сервера, линију за преузимање можете да промените тако да указује само ту грану:

fetch = +refs/heads/master:refs/remotes/origin/master

Ово је само подразумевани рефспек за git fetch за тај удаљени репозиторијум. Ако само једном желите да преузмете, одређени рефспек такође можете да наведете и на командној линији. Ако желите да master грану на удаљеном репозиторијуму повучете у локалну origin/mymaster, извршите следеће:

$ git fetch origin master:refs/remotes/origin/mymaster

Такође можете да наведете и више рефспекова. Овако из командне линије повлачите неколико грана одједном:

$ git fetch origin master:refs/remotes/origin/mymaster \
	 topic:refs/remotes/origin/topic
From git@github.com:schacon/simplegit
 ! [rejected]        master     -> origin/mymaster  (non fast forward)
 * [new branch]      topic      -> origin/topic

У овом случају је повлачење master гране одбијено јер није у питању референца са брзим премотавањем унапред. То можете да премостите ако испред рефспека наведете +.

Више рефспекова такође можете да наведете и у конфигурационом фајлу. Ако сваки пут желите да преузимате master и experiment гране, додајте две линије:

[remote "origin"]
	url = https://github.com/schacon/simplegit-progit
	fetch = +refs/heads/master:refs/remotes/origin/master
	fetch = +refs/heads/experiment:refs/remotes/origin/experiment

Почевши са програмом Гит 2.6.0 у шаблону можете да користите парцијалне глобове који се подударају са више грана, тако да следеће функционише:

fetch = +refs/heads/qa*:refs/remotes/origin/qa*

Још боље, исто можете да постигнете на уређенији начин ако употребите просторе имена (или директоријуме). Ако имате QA тим (тим за контролу квалитета) који гура низ грана, а ви желите да преузмете master грану и било коју од грана QA тима, али ништа друго, можете да употребите овакав конфигурациони одељак:

[remote "origin"]
	url = https://github.com/schacon/simplegit-progit
	fetch = +refs/heads/master:refs/remotes/origin/master
	fetch = +refs/heads/qa/*:refs/remotes/origin/qa/*

Ако користите компликован процес рада у којем QA тим гура гране, програмери гурају гране и тимови за интеграцију гурају и сарађују на удаљеним гранама, на овај начин можете лако да их раздвојите у просторе имена.

Гурање рефспекова

Лепо је што референцу из простора имена можете да преузмете на овај начин, али како је уопште QA ставио њихове гране у qa/ простор имена? То се постиже употребом рефспекова за гурање.

Ако QA тим жели да своју master грану гурне на qa/master на удаљеном серверу, могу да изврше:

$ git push origin master:refs/heads/qa/master

Ако желе да програм Гит аутоматски то ради сваки пут када изврше git push origin, у свој конфигурациони фајл могу да додају push вредност:

[remote "origin"]
	url = https://github.com/schacon/simplegit-progit
	fetch = +refs/heads/*:refs/remotes/origin/*
	push = refs/heads/master:refs/heads/qa/master

Да поновимо, после овога ће git push origin подразумевано да гурне локалну master грану branch на удаљену грану qa/master.

Белешка

Рефспек не можете да искористите за преузимање из једног репозиторијума и гурање на други. Ако то желите да урадите, погледајте пример Одржавање вашег јавног GitHub репозиторијума ажурним.

Брисање референци

Рефспек можете употребити и за брисање референци са удаљеног сервера тако што извршите нешто овако:

$ git push origin :topic

Пошто је рефспек <изв>:<одр>, ако изоставите <изв> део, у суштини кажете да се topic грана на удаљеном репозиторијуму постави ни на шта, односно да се обрише.

Или можете да употребите новију синтаксу (доступно од Гит v1.7.0):

$ git push origin --delete topic