Refspec
W trakcie czytania tej książki, używałeś prostych mapowań ze zdalnych gałęzi do lokalnych referencji; jednak mogą one być znaczniej bardziej złożone. Załóżmy, że dodajesz zdalne repozytorium w taki sposób:
$ git remote add origin [email protected]:schacon/simplegit-progit.git
Doda to kolejną sekcję w pliku .git/config, określającą nazwę zdalnego repozytorium (origin), adres URL tego repozytorium, oraz refspec do pobierania:
[remote "origin"]
url = [email protected]:schacon/simplegit-progit.git
fetch = +refs/heads/*:refs/remotes/origin/*
Refspec składa się z opcjonalnego znaku +, oraz wskazania ścieżki źródłowej i docelowej <src>:<dst>, gdzie <src> wskazuje referencję na zewnętrznym serwerze, a <dst> jest miejscem, w którym te referencje będą zapisywane lokalnie. Znak + wskazuje Gitowi, aby wykonywał aktualizację nawet wtedy, gdy ta referencja nie jest zwykłym przesunięciem (ang. fast-forward).
W zwyczajnym przypadku, jest to zapisywane automatycznie przez komendę git remote add, Git pobiera wszystkie referencje z refs/heads/ na serwerze i zapisuje je do refs/remotes/origin/ lokalnie. Więc, jeżeli istnieje gałąź master na serwerze, możesz uzyskać dostęp do logów tej gałęzi poprzez
$ git log origin/master
$ git log remotes/origin/master
$ git log refs/remotes/origin/master
Wszystkie te komendy są równoważne, ponieważ Git rozwinie je wszystkie do refs/remotes/origin/master.
Jeżeli chciałbyś, aby Git pobierał za każdym razem tylko gałąź master, a nie wszystkie inne gałęzie na zdalnym serwerze, możesz zmienić linię fetch na
fetch = +refs/heads/master:refs/remotes/origin/master
Jest to po prostu domyślna definicja refspec używana przez komendę git fetch podczas pobierania danych ze zdalnego repozytorium. Jeżeli chcesz wykonać coś jednorazowo, możesz podać definicję refspec również z linii komend. Aby pobrać gałąź master z zdalnego serwera, do origin/mymaster możesz uruchomić
$ git fetch origin master:refs/remotes/origin/mymaster
Możesz również ustawić kilka refspec. Z linii komend, możesz pobrać kilka gałęzi za pomocą:
$ 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
W tym wypadku, pobieranie gałęzi master zostało odrzucone, ponieważ nie była to gałąź fast-forward (tzn. nie było możliwe wykonanie prostego przesunięcia w celu włączenia zmian). Możesz to zmienić, poprzez ustawienie znaku + na początku definicji refspec.
Możesz również ustawić wiele definicji refspec w pliku konfiguracyjnym. Jeżeli zawsze chcesz pobierać gałęzie master i experiment, dodaj dwie linie:
[remote "origin"]
url = [email protected]:schacon/simplegit-progit.git
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/experiment:refs/remotes/origin/experiment
Nie możesz użyć masek na ścieżkach, więc takie ustawienie będzie błędne:
fetch = +refs/heads/qa*:refs/remotes/origin/qa*
Możesz jednak użyć przestrzeni nazw aby osiągnąć podobny efekt. Jeżeli masz zespół QA, który wypycha nowe gałęzie, a Ty chcesz pobrać tylko gałąź master oraz wszystkie gałęzie stworzone przez zespół QA, możesz wpisać w pliku konfiguracyjnym coś takiego:
[remote "origin"]
url = [email protected]:schacon/simplegit-progit.git
fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/qa/*:refs/remotes/origin/qa/*
Jeżeli masz bardziej złożony sposób współpracy, w którym zespół QA wypycha gałęzie, programiści wypychają gałęzie, oraz zespół integrujący również wypycha oraz współpracuje ze zdalnymi gałęziami, możesz stworzyć dla każdego z nich przestrzenie nazw w ten sposób.
Wypychanie Refspecs
Fajnie, że w tym sposobem możesz pobrać referencje z konkretnych referencji, ale w jaki sposób zespół QA ma wstawiać swoje gałęzie do przestrzeni qa/ w pierwszej kolejności? Możesz to osiągnąć, poprzez użycie refspec dla komendy push.
Jeżeli zespół QA chce wypychać swoją gałąź master do qa/master na zdalnym serwerze, mogą oni uruchomić
$ git push origin master:refs/heads/qa/master
Jeżeli zechcą, aby Git robił to automatycznie za każdym razem po uruchomieniu git push origin, mogą dodać definicję push do swojego pliku konfiguracyjnego:
[remote "origin"]
url = [email protected]:schacon/simplegit-progit.git
fetch = +refs/heads/*:refs/remotes/origin/*
push = refs/heads/master:refs/heads/qa/master
I znowu, to spowoduje, że komenda git push origin będzie domyślnie wypychała lokalną gałąź master do zdalnej qa/master.
Usuwanie referencji
Możesz również używać definicji refspec do usuwania referencji ze zdalnego serwera, poprzez uruchomienie komendy podobnej do:
$ git push origin :topic
Ponieważ refspec składa się z <src>:<dst>, przez opuszczenie części <src>, wskazujesz aby stworzyć nową pustą gałąź tematyczną, co ją kasuje.