Git
Chapters ▾ 2nd Edition

10.5 Notranjost Git-a - The Refspec

The Refspec

Skozi to knjigo smo uporabljali enostavne preslikave iz oddaljenih vej na lokalne reference, vendar lahko so bolj kompleksne. Predpostavimo, da dodate daljavo sledeče:

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

Doda sekcijo v vašo datoteko .git/config, ki določa ime daljave (origin), URL oddaljenega repozitorija in refspec za ujemanje:

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

Oblika refspec-a je opcijski +, ki mu sledi <src>:<dst>, kjer je <src> vzorec za reference na oddaljeni strani in <dst> je lokacija, kamor bodo te reference zapisane lokalno. + pove Git-u, da posodobi referenco tudi če ni t.i. fast-forward.

V privzetem primeru, je to avtomatsko prepisano z ukazom git remote add, Git ujame vse reference pod refs/heads/ na strežniku in jih zapiše v regs/remotes/origins/ lokalno. Torej, če je na strežniku veja master, lahko dostopate do dnevnika te veje lokalno preko

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

Vsi ukazi so ekvivalentni, ker Git vsakega razširi v refs/remotes/origins/master.

Če želite, da Git namesto tega vsakič potegne samo vejo master in ne vseh ostalih vej na oddaljenem strežniku, lahko spremenite vrstico ujetja na

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

To je samo privzeti refspec za git fetch za to daljavo. Če želite narediti nekaj enkrat, lahko določite refspec tudi v ukazni vrstici. Da potegnete vejo master na daljavi dol v origin/mymaster lokalno, lahko poženete

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

Lahko določite tudi več refspec-ov. V ukazni vrstici lahko potegnete dol več vej sledeče:

$ 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

V tem primeru je bil poteg veje master zavrnjen, ker ni bil referenca fast-forward. To lahko prepišete z določanjem + na začetku refspec.

V vaši nastavitveni datoteki lahko določite tudi več refspec za ujetje. Če želite vedno ujeti veje master in experiment, dodajte dve vrstici:

[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

Ne morete uporabiti več globov v vzorcu, torej to bi bilo neveljavno:

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

Vendar lahko uporabite imenski prostor (ali direktorije) za dosego nečesa takega. Če imate ekipo QA, ki potiska serijo vej in želite dobiti vejo master in katerokoli vejo od ekipe QA vendar ničesar več, lahko uporabite sledečo sekcijo nastavitev:

[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/*

Če imate kompleksen potek dela, ki ima potiskalne veje ekipe QA , potiskalne veje razvijalcev in ekipe integracije in sodelujete na oddaljenih vejah, lahko naredite imenski prostor enostavno na ta način.

Refspec-i za potiskanje

Lepo je, če lahko ujamete reference imenskega prostora na ta način, vendar kako ekipa QA dobi svoje veje v imenski prostor qa/ na prvem mestu? To lahko dosežete z uporabo refspec-ov za potiskanje.

Če ekipa QA želi potisniti svojo vejo master v qa/master na oddaljenem strežniku, lahko poženejo

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

Če želijo, da Git to naredi avtomatsko vsakič, ko poženejo git push origin, lahko dodajo vrednost push v svojo nastavitveno datoteko:

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

Ponovno, bo to povzročilo, da git push origin potisne lokalno vejo master na daljavo qa/master vejo privzeto.

Brisanje referenc

Lahko uporabite tudi refspec za izbris referenc iz oddaljenega strežnika s pogonom nečesa takega:

$ git push origin :topic

Ker je refspec <src>:<dst>, z opuščanjem <src> dela, to v osnovi pravi, da naredite tematsko vejo na nobeni daljavi, kar jo izbriše.