Tuesday, October 9, 2007

Podstawy subversion (SVN)

No tak, pewnie (podobnie jak ja) słyszałeś 2,500 razy aby tego używać w swoich projektach ale może wciąż zastanawiasz się po co, i jak. Sp19róbujemy coś z tym zrobić.

Co robi SVN ?
W dużym skrócie SVN przetrzymuje pliki, które każesz mu przetrzymywać jednak w taki sposób, że jest w stanie otworzyć dowolny z tych plików w dowolnej z jego kiedykolwiek istniejących wersji. Jeżeli edytowałeś plik 100 razy i wprowadziłeś w nim 100 zmian. To SVN pozwoli Ci wrócić do dowolnej ze zmian (przywrócić plik w postaci z przed zmiany 39 jak i z postaci jaką przybrał po zmianie 76).

Po co SVN ?
Podam kilka tylko przypadków w których SVN okazuje się użyteczny:
  1. Masz system operacyjny, w którym jest kilku administratorów. Trzymanie w SVN plików konfiguracyjnych systemu pozwala na natychmiastowe wrócenie do stanu poprzedniego (działania) w momencie w którym po jakiejś zmianie coś przestaje działać - bez zastanawiania się i szukania pomyłki.
  2. Kilku programistów pracuje nad tym samym projektem i istnieje groźba, że będą pracowali nad tym samym fragmentem kodu w jednym czasie.
  3. Szlak trafił nam projekt, ktoś narozrabiał i wywalił pliki, które właśnie są Ci potrzebne. Przywracasz je jednym poleceniem.
  4. Nawet jeżeli coś było tylko epizodem w twoim życiu i dawno usunąłeś te dwa skrypty rubego ze swojego dysku, a używałeś w trakcie svn-a to możesz (nawet po 2 latach) do nich wrócić....
Skrócony opis obsługi SVN:
Oprę się na świetnym tutorialu dostępnym pod adresem: http://artis.imag.fr/~Xavier.Decoret/resources/svn/index.html
Przedstawię tylko i wyłącznie podstawy jednak w pewnym konkretnym ujęciu, które może okazać się dobrym uzupełnieniem powyższego artykułu:
  1. Tworzymy miejsce, w którym będziemy przetrzymywać nasz projekt:
    mkdir /mnt/saveplace/dziubdziub/svn
    svnadmin create --fs-type fsfs /mnt/saveplace/dziubdziub/svn
    Tak przygotowany katalog będzie bazą dla polecenie svn, którym zaczniemy się posługiwać.
  2. Importujemy nasz projekt do svn (robimy to tylko raz ! na początku projektu):
    svn import /home/dziubdziub/poszukiwania file:///
    mnt/saveplace/dziubdziub/svn/poszukiwania -m "Initial import"
    Co właśnie zrobiliśmy ? Otóż kazaliśmy svn-owi (w jemu tylko znany sposób) zaimportować cały projekt z plikami i opisać tą zmianę "Initial import"
  3. Po imporcie musimy wykonać checkout (tylko raz tylko na początku zaraz po zaimportowaniu), który pobierze nasze pliki z svn-a. Możemy wykonać go do innego katalogu. Możemy wykasować istniejący projekt i w jego miejsce pobrać spowrotem te same pliki z svn-a:
    cd
    /home/dziubdziub
    rm -fr poszukiwania
    svn checkout file:///mnt/saveplace/dziubdziub/svn/poszukiwania
  4. Kiedy wykonaliśmy checkout możemy zacząć używać svn-a. Od tej pory w katalogach z projektem istnieją katalogi .svn, które przetrzymują informacje pozwalające nam nie podawać ścieżki file://... ale działać bez niej (dzięki tym katalog svn sam wie gdzie są trzymane repozytoria) Powiedzmy, że nad projektem na tym repozytorium pracuje kilku programistów. Aby mieć najświeższą wersję ZAWSZE przed rozpoczęciem pracy wykonujemy:
    cd /home/dziubdziub/poszukiwania
    svn update
    Dzięki czemu pobierzemy najnowszą wersje plików.
  5. Po wprowadzonej przez siebie zmianach schodzimy do najniższego katalogu i patrzymy co się zmieniło:
    svn status
    ?
    - plik został dodany lub usunięty i nie wiadomo co z nim zrobić
    ! - plik został usunięty
    M - plik został zmodyfikowany
  6. Podejmujemy jedną z kilku akcji względem plików oznaczonych ?:
    svn add sciezka/do/pliku - dodajemy (?)
    svn rm sciezka/do/pliku - usuwamy (!)
  7. Po podjęciu akcji (nie ma żadnych plików oznaczonych ?, ! ale same oznaczone A(dd), D(elete), M(odify) każemy wprowadzić zmiany do repozytorium SVN:
    svn commit -m "Description of changes"
  8. Za każdym razem po wprowadzeniu zmian musimy ponownie (jakby od początku) wykonać svn update ponieważ nasze zmiany zostały nałożone na zmiany innego programisty w svn i trzba pobrać skompilowaną wersję tych wszystkich wspólnych zmian (które łączy svn):
    svn update
Luźne rady:
  1. Komituj każdą najdrobniejszą zmianę. Im więcej i częściej będziesz komitować tym szczegółowiej będziesz mógł określić, która ze zmian Cię intereuje w kodzie (i chcesz ją zatrzymać) a która nie.
  2. Nie warto dodawać do repozytorium plików czy katalogów tymczasowych czy np... plików pochodzących z mechanizmu cachowanie czy logów. Dlatego warto oznaczyć niektóre katalogi aby były ignorowane (zmiany w nich zachodzące dokładnie) przez svn. Powiedzmy, że mamy katalog tmp w którym jest katalog cache i logs, których zawartości nie chcemy brać pod uwagę podczas naszego commitowania. Każdy z katalogów ma swoją listę ignorowanych plików. Robimy to mniej więcej tak:
    cd /home/dziubdziub/poszukiwania/tmp
    svn propedit svn:ignore logs
    Wpisujemy:
    *
    Od teraz w katalogu logs ustawiony jest parametr svn:ignore na * (wszystkie pliki). Analogicznie postępujemy z cache:
    cd /home/dziubdziub/poszukiwania/tmp
    svn propedit svn:ignore cache
    Wpisujemy:
    *
  3. Aby przywrócić jakiś plik wpisz:
    svn revert sciezka/do/pliku
  4. Program svn pozwala nam działać na wirtualnym systemie plików znajdującym się w: /mnt/saveplace/dziubdziub/svn na zasadzie zwykłych poleceń systemowych poprzedzonych svn:
    svn ls file:///mnt/saveplace/dziubdziub/svn/poszukiwania
    svn rm file://...
    svn mkdir file://...
    svn tree file://...
    Pomimo tego, że polecenia:
    ls file:///mnt/saveplace/dziubdziub/svn/poszukiwania
    rm file://...
    mkdir file://...
    t
    ree file://...
    A w katalogu /mnt/saveplace/dziubdziub/svn wcale nie znajdzmyjawnie pokazanych naszych folderów, ale tylko i wyłącznie wewnętrzną strukturę organizacji danych stworzoną przez svnadmin.

1 comment:

Wiktor said...

Ignorowanie mozna zrobic tez tak (jak chcemy ignorowac katalog tmp):

svn propset svn:ignore "*" tmp