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:
1 2 3 4 5 6 |
> 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:
1 |
git --bare init |
Co 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.
1 |
> cd /projekty/gittutor |
który jest już pod kontrolą wersji. Wydajemy komendę:
1 |
> git remote add centrala ssh://projekty.pl/repos/gittutor.git |
1 |
git remote add |
dodaje nowe zdalne repozytorium,
1 |
centrala |
nasza nazwa tego zdalnego repozytorium,
1 |
ssh://projekty.pl/repos/gittutor.git |
url do tego zdalnego repozytorium.
Sprawdźmy, czy dodano nasze zdalne repozytorium:
1 2 3 4 |
> 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:
1 |
> git push centrala master |
Jako pierwszy argument podajemy nazwę zdalnego repozytorium, jako drugi lokalny branch, który ma być wysłany.
1 2 3 4 5 6 7 |
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).
1 2 3 4 5 6 7 8 9 10 11 12 13 |
> 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.
1 2 3 4 5 6 7 8 9 10 11 |
> 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)
1 2 3 4 5 6 7 |
> 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ę
1 2 3 4 5 6 7 8 9 10 11 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
> 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
1 2 3 4 |
> 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.
1 2 3 |
> 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:
1 2 3 4 5 6 7 8 |
> 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.
.