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 [email protected]: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.
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.
Note
|
Refspeca ne morete uporabiti za prenos iz enega repozitorija in potiskanje na drugega. Za primer, da to naredite, se sklicujte na odsek ch06-github.asc. |
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