Bazaar w sześć minut

Bazaar jest jednym z systemów rozproszonej kontroli wersji, który można wykorzystać na przykład do zarządzania zmianami w serwisie internetowym, niezależnie od tego w jakiej technologii jest on wykonany.
Zakładam, że mamy gotowy już serwis na serwerze, który zrobiliśmy kiedyś bez kontroli wersji. Naszym celem jest wykonanie kopii na lokalnej maszynie (np. laptopie), a następnie testowanie zmian na kopii lokalnej i "ładowanie" tych zmian na serwer pod kontrolą systemu kontroli wersji. Niniejszy artykuł nie próbuje odpowiedzieć na pytanie "po co mi system kontroli wersji". Zakładam, że rozumiesz jego konieczność, a zastanawiasz się którego użyć i w jaki sposób. (Jeśli nie, to np. tutaj http://pl.wikipedia.org/wiki/System_kontroli_wersji jest definicja, a tutaj http://www.maciejaniserowicz.com/post/2008/06/02/Kontrola-wersji-w-5-min... jest króciutkie i jasne wprowadzenie po co to wszystko).

Zakładam też, że na serwerze jest dostępna linia poleceń i można tam instalować oprogramowanie. Jest też możliwy scenariusz o ograniczonej funkcjonalności bez instalacji bazaara na serwerze (np. wtedy, gdy nie jest ona możliwa). Sposób postępowania dla tego przypadku jest opisany tutaj: http://wiki.bazaar.canonical.com/BazaarUploadForWebDev.
Najpierw instalujemy bazaar. Instalacja jest oczywista i dobrze opisana zarówno dla linuksów jak windowsów np. tutaj: http://doc.bazaar.canonical.com/bzr.2.3/en/user-guide/installing_bazaar.....
Instalacji musimy dokonać zarówno na serwerze i jak i na lokalnej maszynie.
Zanim zrobimy cokolwiek po instalacji musimy się systemowi przedstawić:

bzr whoami

Wystarczy, że podamy tu adres e-mail. Po udanej instalacji na serwerze zamieniamy nasz działający serwis w repozytorium bazaara. W tym celu przechodzimy do katalogu głównego naszego serwisu i w linii poleceń piszemy:
bzr init

Teraz powinniśmy zastanowić się jakie pliki nie będą objęte kontrolą wersji i poinformować o naszej decyzji bazaara. Typowo nie obejmujemy kontrolą wersji plików skompilowanych (np. *.pyc w pythonie). raczej nie ma tez sensu wersjonować obrazków. Dlatego możemy napisać:
bzr ignore "*.pyc"
bzr ignore "*.jpg"
bzr ignore "*.png"
bzr ignore "*.gif"

Być może będziemy chcieli wykluczyć jeszcze inne pliki w zależności od sytuacji. Więcej informacji możemy uzyskać pisząc
bzr help ignore

Kiedy już zakończymy wykluczenia dodajemy wszystkie niewykluczone pliki do repozytorium poleceniem
bzr add

Żeby zadziałało ono tak jak oczekujemy, musi być wydane wewnątrz katalogu, który ma być naszym repozytorium.
Od tego momentu mamy działające repozytorium na serwerze. Musimy jeszcze wykonać początkową wersję, która będzie punktem wyjścia dla tworzenia następnych. Robimy to pisząc:
bzr commit -m "stan początkowy"
Od tej pory każdą kompletną zmianę w serwisie powinniśmy "commitować" w ten sposób.
Zanim zaczniemy pracować na maszynie lokalnej musimy na niej jeszcze doinstalować plugin push_and_update
Wykonujemy to poleceniem:
bzr branch <a href="https://launchpad.net/bzr-push-and-update" title="https://launchpad.net/bzr-push-and-update">https://launchpad.net/bzr-push-and-update</a> push_and_update 

Lokalną kopię serwisu wykonamy już pod kontrolą systemu kontroli wersji. Na lokalnej maszynie ustawiamy się w katalogu, a w którym ma znaleźć się katalog z naszą roboczą kopią, ale nie tworzymy tego katalogu. Inaczej mówiąc, jeśli nasz katalog na serwerze jest w /srv/serwisy/przykladowy i chcemy, żeby nasza kopia znajdowała się w katalogu /home/michal/przykladowy, to ustawiamy sie w katalogu /home/michal i nie tworzymy katalogu przykladowy, bazaar utworzy go sam.
Teraz zaczyna się najważniejsza część całej operacji. Wydajemy polecenie, które utworzy nam na lokalnej maszynie "gałąź" (branch) serwisu.
bzr branch sftp://username@naszserwer.com/srv/serwisy/przykladowy

To może potrwać nawet kilkadziesiąt minut, albo i dłużej, zależnie od tego, jak duży jest serwis i jak szybkie łącze.
Po zakończeniu zobaczymy na lokalnym dysku katalog z naszym serwisem. Jeśli kazaliśmy bazaarowi ignorować obrazki, to musimy je teraz doinstalować ręcznie.
Teraz możemy spróbować wykonać jakąś zmianę na maszynie lokalnej. Np utwórzmy pik README.txt, w którym napiszemy, że serwis jest tworzony przy pomocy systemu kontroli wersji "bazaar".
Teraz robimy:
bzr add README.txt
bzr commit -m "dodano README"

Spróbujemy teraz przesłać zmiany na serwer.
Na maszynie lokalnej, w katalogu serwisu piszemy:

bzr push --create-prefix sftp://username@naszserwer.com/sciezka/do/serwisu

Uwaga. To polecenie prześle informację o naszej modyfikacji, ale nie będzie jeszcze ona widoczna. Żeby stała się widoczna musimy wykonać jeszcze na serwerze polecenie
bzr update

Teraz zajmiemy się procesem odwrotnym. Zakładam, że z jakichś powodów kolejnych modyfikacji dokonujemy bezpośrednio na serwerze. Na przykład wyedytujmy za pomocą vim, czy innego edytora, nasz plik README.txt na serwerze i dopiszmy do niego nasze imię i nazwisko. Zapisujemy plik, wychodzimy z edytora. Na serwerze robimy
bzr commit -m "dopisane nazwisko"

Przechodzimy na naszą maszynę lokalną. Polecenie

bzr merge sftp://username@naszserwer.com/sciezka/do/serwisu

powinno "ściągnąć" zmiany z serwera.