-
1. Začetek
- 1.1 O nadzoru različic
- 1.2 Kratka zgodovina Gita
- 1.3 Kaj je Git?
- 1.4 Ukazna vrstica
- 1.5 Namestitev Gita
- 1.6 Prva nastavitev Gita
- 1.7 Pridobivanje pomoči
- 1.8 Povzetek
-
2. Osnove Git
- 2.1 Pridobivanje repozitorija Git
- 2.2 Snemanje sprememb v repozitorij
- 2.3 Pregled zgodovine potrditev
- 2.4 Razveljavljanje stvari
- 2.5 Delo z daljavami
- 2.6 Označevanje
- 2.7 Aliasi Git
- 2.8 Povzetek
-
3. Veje Git
- 3.1 Veje na kratko
- 3.2 Osnove vej in združevanja
- 3.3 Upravljanje vej
- 3.4 Poteki dela z vejami
- 3.5 Oddaljene veje
- 3.6 Ponovno baziranje
- 3.7 Povzetek
-
4. Git na strežniku
- 4.1 Protokoli
- 4.2 Pridobitev Gita na strežniku
- 4.3 Generiranje vaših javnih ključev SSH
- 4.4 Nastavitev strežnika
- 4.5 Prikriti proces Git
- 4.6 Pametni HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Možnosti gostovanja pri tretjih ponudnikih
- 4.10 Povzetek
-
5. Porazdeljeni Git
- 5.1 Porazdeljeni poteki dela
- 5.2 Prispevek k projektu
- 5.3 Vzdrževanje projekta
- 5.4 Povzetek
-
6. GitHub
-
7. Orodja Git
- 7.1 Izbira revizije
- 7.2 Interaktivno pripravljanje
- 7.3 Shranjevanje na varno (angl. stashing) in čiščenje
- 7.4 Podpisovanje vašega dela
- 7.5 Iskanje
- 7.6 Prepisovanje zgodovine
- 7.7 Demistifikacija ponastavitve
- 7.8 Napredno združevanje
- 7.9 Rerere
- 7.10 Razhroščevanje z Gitom
- 7.11 Podmoduli
- 7.12 Povezovanje v pakete
- 7.13 Zamenjava
- 7.14 Shramba poverilnic
- 7.15 Povzetek
-
8. Prilagoditev Gita
- 8.1 Konfiguracija Git
- 8.2 Atributi Git
- 8.3 Kljuke Git
- 8.4 Primer pravilnika, ki ga uveljavlja Git
- 8.5 Povzetek
-
9. Git in ostali sistemi
- 9.1 Git kot odjemalec
- 9.2 Migracija na Git
- 9.3 Povzetek
-
10. Notranjost Gita
- 10.1 Napeljava in keramika
- 10.2 Objekti Git
- 10.3 Reference Git
- 10.4 Packfiles (datoteke zmanjšanih podatkov)
- 10.5 Refspec
- 10.6 Protokoli prenosa
- 10.7 Vzdrževanje in obnovitev podatkov
- 10.8 Spremenljivke okolja
- 10.9 Povzetek
-
A1. Dodatek A: Git v drugih okoljih
- A1.1 Grafični vmesniki
- A1.2 Git v Visual Studio
- A1.3 Git v Visual Studio Code
- A1.4 Git v IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git v Sublime Text
- A1.6 Git v Bashu
- A1.7 Git v Zsh
- A1.8 Git v Powershellu
- A1.9 Povzetek
-
A2. Dodatek B: Vdelava Gita v vašo aplikacijo
- A2.1 Git v ukazni vrstici
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Dodatek C: Ukazi Git
- A3.1 Nastavitev in konfiguracija
- A3.2 Pridobivanje in ustvarjanje projektov
- A3.3 Osnove posnetkov
- A3.4 Veje in združevanje
- A3.5 Deljenje in posodabljanje projektov
- A3.6 Pregled in primerjava
- A3.7 Razhroščevanje
- A3.8 Popravljanje
- A3.9 E-pošta
- A3.10 Zunanji sistemi
- A3.11 Administracija
- A3.12 Orodja za sisteme napeljave
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