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 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.

 > 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 master

Jako 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.

  • Wykop
  • Blip
  • Twitter
  • Facebook
  • DZone
  • Digg
  • Blinklist
  • Delicious
  • Evernote
  • LinkedIn
  • Google Bookmarks
  • Google Buzz
  • Google Reader
  • Share/Bookmark

Podobne wpisy:

One Response to “Praca ze zdalnym repozytorium w GIT”

  • dagon Says:

    Bardzo fajny artykul. Dopiero zaczynam prace z gitem i chcialem przekonwertowac moje obecne repozytoria CVS na gita, przeczytanie tego opisu wiele mi wyjasnilo. Dzieki.

Leave a Reply