Praca ze zdalnym repozytorium w GIT
Jak obiecałem w jednym z poprzednich artykułów opiszę jak wygląda praca z projektem za pośrednictwem zdalnego repozytorium.
Większość projektów nie jest prowadzona samodzielnie, jest w niego zaangażowane kilku (-nastu, -dziesięciu) innych programistów. Każdy z nich może lokalnie prowadzić własną ścieżkę, ale z doświadczenia wiem, że przydaje się jedno wspólne repozytorium. Punkt centralny dla naszej pracy.
Inicjalizacja repozytorium
Przypuśćmy, że posiadamy serwer w domenie projekty.pl i tam chcemy założyć nasze centralne repozytorium. W tym celu logujemy się na naszym serwerze:
> ssh projekty.pl cd /repos mkdir gittutor.git cd gittutor.git git --bare init exit
To wszystko. Wszystkie powyższe komendy za pewne są jasne, tylko jedna może nasuwać pewne niepewności:
git --bare initCo daje nam atrybut –bare? Otóż w naszym zdalnym repozytorium nie potrzebujemy kopii plików projektu tylko samą informację o repozytorium. To właśnie robi atrybut –bare – tworzy strukturę plików repozytorium, do którego możemy się połączyć tylko zdalnie bez plików projketu wewnątrz.
Po wylogowaniu się z naszego serwera wracam do naszego projektu na lokalnym komputerze.
> cd /projekty/gittutor
który jest już pod kontrolą wersji. Wydajemy komendę:
> git remote add centrala ssh://projekty.pl/repos/gittutor.git
git remote add
dodaje nowe zdalne repozytorium,
centrala
nasza nazwa tego zdalnego repozytorium,
ssh://projekty.pl/repos/gittutor.git
url do tego zdalnego repozytorium.
Sprawdźmy, czy dodano nasze zdalne repozytorium:
> git remote show centrala * remote centrala URL: ssh://projekty.pl/repos/gittutor.git HEAD branch: (unknown)
Wysyłanie plików na zdalny serwer
Do synchronizacji lokalnego repozytorium ze zdalnym wykonujemy za pomocą komend git push oraz git pull. Spóbujmy wysłać pliki do naszego zdalnego repozytorium:
> git push centrala masterJako pierwszy argument podajemy nazwę zdalnego repozytorium, jako drugi lokalny branch, który ma być wysłany.
Counting objects: 32, done. Delta compression using up to 2 threads. Compressing objects: 100% (22/22), done. Writing objects: 100% (32/32), 2.72 KiB, done. Total 32 (delta 4), reused 0 (delta 0) To ssh://projekty.pl/repos/gittutor.git * [new branch] master -> master
W ten sposób umieściliśmy nasz projekt w zdalnym repozytorium.
Klonowanie repozytorium
Teraz gdy nasze pliki znajdują się w zdalnym repozytorium możemy je w prosty sposób sklonować (np. dla nowego członka zespołu pracującego nad projektem).
> git clone ssh://projekty.pl/repos/gittutor.git Initialized empty Git repository in /projekty/gittutor2/gittutor/.git/ remote: Counting objects: 32, done. remote: Compressing objects: 100% (22/22), done. remote: Total 32 (delta 4), reused 0 (delta 0) Receiving objects: 100% (32/32), done. Resolving deltas: 100% (4/4), done. cd gittutor git remote show origin
“origin” jest domyślną nazwa nadawaną dla zdalnego repozytorium. Zauważmy, że po klonowaniu w naszym projekcie jest ustawione zdalne repozytorium (to z którego klonowaliśmy pliki) – nie musimy tego robić ręcznie.
Praca ze zdalnym repozytorium
Sprawdźmy jeszcze jeden ciekawy scenariusz – jeden z programistów zakłada własny projekt od zera i synchronizuje go z naszym zdalnym repozytorium.
> mkdir gittutor3 cd gittutor3 git init git remote add origin ssh://projekty.pl/repos/gittutor.git echo "plik2" > nowy_plik.txt git add nowy_plik.txt git commit -m "Dodano nowy plik" [master (root-commit) 577763f] Dodano nowy plik 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 nowy_plik.txt
Co zrobiłem? Utworzyłem nowy katalog, dodałem go do kontroli wersji (’init’) ustawiłem zdalne (dobrze nam znane
) repozytorium. Następnie dodałem plik i skommitowałem go do lokalnego repozytorium.
Teraz musimy wysłać naszego brancha na serwer. Po nazwie lokalnego musimy podać nazwę pod jaką nasz branch będzie widniał w zdalnym repozytorium (po dwukropku)
> git push origin master:fajny_projekt Counting objects: 3, done. Writing objects: 100% (3/3), 223 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To ssh://projekty.pl/repos/gittutor.git * [new branch] master -> fajny_projekt
Teraz przełączmy się do folderu z którego rozpoczęliśmy pracę
cd ../gittutor > git remote show centrala * remote centrala URL: ssh://projekty.pl/repos/gittutor.git HEAD branch: master Remote branches: fajny_projekt new (next fetch will store in remotes/centrala) master tracked Local ref configured for 'git push': master pushes to master (up to date)
Widać, że zdalny branch jest widoczny – jednak w jaki sposób się na niego ‘przełączyć’? Najpierw musimy zaktualizować nasz mirror zdalnego repozytorium:
> git fetch centrala Unpacking objects: 100% (3/3), done. remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 0 (delta 0) From ssh://projekty.pl/repos/gittutor * [new branch] fajny_projekt -> centrala/fajny_projekt git remote show centrala * remote centrala URL: ssh://projekty.pl/repos/gittutor.git HEAD branch: master Remote branches: fajny_projekt tracked master tracked Local ref configured for 'git push': master pushes to master (up to date)
aktualnie skopiowaliśmy zdalny fajny projekt do lokalnego repozytorium.
Można go zobaczyć na liście branchy
> git branch -a * master remotes/centrala/fajny_projekt remotes/centrala/master
Jeżeli teraz chcemy dokonać zmian na tym zdalnym repozytorium musimy utworzyć lokalnego brancha, który będzie śledził (tracking) ten zdalny.
> git checkout --track -b fajny_projekt centrala/fajny_projekt Branch fajny_projekt set up to track remote branch fajny_projekt from centrala. Switched to a new branch 'fajny_projekt'
Utworzono lokalny branch pod nazwą ‘fajny_projekt’ ze zdalnego ‘centrala/fajny_projekt’ i od razu zaznaczono go jako aktywny sprawdźmy:
> git branch -a * fajny_projekt master remotes/centrala/fajny_projekt remotes/centrala/master > ls nowy_plik.txt
Mam nadzieję, że wszystko jest zrozumiałe, jest późno – a o tej godzinie to czasami sam nie do końca wiem co piszę
. W razie nieścisłości proszę o słówko w komentarzach.

January 12th, 2010 at 14:00
Bardzo fajny artykul. Dopiero zaczynam prace z gitem i chcialem przekonwertowac moje obecne repozytoria CVS na gita, przeczytanie tego opisu wiele mi wyjasnilo. Dzieki.