Git
Chapters ▾ 2nd Edition

10.5 Notranjost Gita - Refspec

Refspec

Skozi to knjigo smo uporabljali enostavne preslikave iz oddaljenih vej na lokalne reference, vendar lahko so bolj kompleksne. Predpostavimo, da ste sledili zadnjim nekaj razdelkom in ustvarili majhen lokalen repozitorij Git ter mu sedaj želite dodati daljavo:

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

Pogon zgornjega ukaza doda razdelek v datoteko .git/config vašega repozitorija, kar določa ime daljave (origin), URL oddaljenega repozitorija in refspec za prenašanje:

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

Oblika refspec je najprej neobvezni +, ki mu sledi <src>:<dst>, kjer je <src> vzorec za reference na oddaljeni strani in <dst> je lokacija, kjer bodo te reference sledene lokalno. + pove Gitu, naj posodobi referenco, tudi če ni t. i. fast-forward.

V privzetem primeru, je to avtomatsko zapisano z ukazom git remote add origin, Git prenese vse reference pod refs/heads/ na strežniku in jih zapiše v refs/remotes/origin/ lokalno. Torej, če je na strežniku veja master, lahko dostopate do dnevnika te veje lokalno preko katerega koli od teh ukazov:

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

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

Če želite, da Git namesto tega vsakič povleče samo vejo master in ne vseh ostalih vej na oddaljenem strežniku, lahko spremenite vrstico prenosa, da se sklicuje samo na tisto vejo:

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

To je samo privzeti refspec za git fetch za tisto daljavo. Če želite narediti samo enkratni prenos, lahko določite refspec tudi v ukazni vrstici. Da povlečete vejo master na daljavi v origin/mymaster lokalno, lahko poženete:

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

Določite lahko tudi več refspecov. V ukazni vrstici lahko povlečete več vej na naslednji način:

$ 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 bilo vlečenje veje master zavrnjeno, ker ni bila na seznamu referenc fast-forward. To lahko prepišete z določanjem + pred refspec.

V vaši nastavitveni datoteki lahko določite tudi več refspecov za prenos. Če želite vedno prenesti veji master in experiment iz daljave origin, 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

Od Git različice 2.6.0 lahko v vzorcu uporabite delne globe, da se prilegajo več vejam, torej to deluje:

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

Še bolje, uporabite lahko imenski prostor (ali direktorije), da dosežete enako z več strukture. Če imate ekipo QA, ki potiska serijo vej in želite dobiti vejo master ter katerokoli vejo od ekipe QA, vendar ničesar drugega, lahko uporabite naslednji razdelek 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 proces poteka dela, ki ima veje za potiskanje ekipe QA, veje za potiskanje razvijalcev in ekipe integracije potiskajo in sodelujejo na oddaljenih vejah, lahko enostavno naredite imenski prostor na ta način.

Potiskanje refspecov

Dobro je, če lahko prenesete reference imenskega prostora na ta način, vendar kako sploh ekipa QA dobi svoje veje v imenski prostor qa/? To lahko dosežete z uporabo refspecov za potiskanje.

Če želi ekipa QA 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, to bo povzročilo, da git push origin privzeto potisne lokalno vejo master na daljavo qa/master vejo.

Opomba

Refspeca ne morete uporabiti za prenos iz enega repozitorija in potiskanje na drugega. Za primer, da to naredite, se sklicujte na odsek Poskrbite, da bo vaš javni repozitorij GitHub posodobljen.

Brisanje referenc

Refspec lahko uporabite tudi za brisanje referenc iz oddaljenega strežnika s pogonom nečesa takega:

$ git push origin :topic

Ker je refspec <src>:<dst>, z opustitvijo dela <src> to v osnovi pomeni, naj naredi vejo topic na nikakršni daljavi, kar jo izbriše.

Lahko pa uporabite novo sintakso (na voljo od različice Git v1.7.0):

$ git push origin --delete topic
scroll-to-top