This post comes from the first version of this blog.
Please send me an email if anything needs an update. Thanks!

Czas na przełamanie hegemonii Firefoksa we wtorkowych poradach. Dzisiaj chciałbym zaprezentować Wam ciekawy sposób wykorzystania jednego z najbardziej popularnych graficznych narzędzi do obsługi systemu kontroli wersji SVN - TortoiseSVN. Myślę, że ułatwi ona pracę w wielu przypadkach, kiedy nie będziemy mieli do dyspozycji odpowiednich narzędzi.

Problem.

Podczas pracy nad stronami internetowymi nierzadko trafiam na sytuację, gdzie klient w dobrej wierze kupił hosting, aby na nim uruchomić produkt mojego wysiłku. Nie ma w tym nic złego - poza tym, że w zdecydowanej większości przypadków usługa, którą nabył jest mało funkcjonalna dla nas, programistów. Od porządnego serwera każdy z nas oczekuje przynajmniej obsługi SSH, a na pewno nie zaszkodziłby konsolowy klient SVN, dzięki czemu moglibyśmy wgrać wszystkie dane za pomocą jednego polecenia.

Nie zawsze mamy taką możliwość i bardzo często kończymy na wgrywaniu na serwer instalacji własnego skryptu lub jednego z CMSów poprzez zwykłe FTP poprzez Total Commandera albo WinSCP. Własny kod, albo kod WordPressa to tzw. “pikuś” - jeśli przyjdzie nam kopiować np. instalację Joomli czy Drupala, to niestety musimy się nastawić na co najmniej półgodzinny przestój w pracy - tysiące małych pliczków skutecznie doprowadzą nas na wyższy poziom świadomości. ;]

W każdym razie wgranie strony na serwer jest sytuacją relatywnie jednorazową. Co, jeśli mamy nią aktywnie administrować i wrzucać wszelkie zmiany w ten sposób? Potrzebujemy narzędzia, które powie nam, co się zmieniło od ostatniego czasu - rozwiązanie polegające na pamiętaniu, które pliki zostały zmienione i kopiowaniu ich pojedynczo na serwer nie jest zbyt szczęśliwym pomysłem. Korzystając z systemu kontroli wersji SVN, możemy zobaczyć, co się zmieniło, niestety jednak narzędzie konsolowe nie udostępnia nam opcji eksportu zmian pomiędzy rewizjami. Co zatem możemy zrobić?

Rozwiązanie.

Narzędzie TortoiseSVN udostępnia nam funkcję "Logu", pokazującego listę commitów do repozytorium - aby się do niej dostać, kliknijmy prawym klawiszem myszy na wersjonowanym katalogu i z menu kontekstowego wybierzmy TortoiseSVN > Show Log. Klikając na liście różne pozycje widzimy, jak zmienia się lista plików, które zostały zmienione w danej rewizji:

Jeśli zaznaczymy kilka rewizji na raz - np. klikając na jedną z nich i wybierając drugą przytrzymując wciśnięty klawisz [Shift] widzimy, że w okienku listy plików znajdują się wszystkie pliki zmienione w danej rewizji:

Zaraz, zaraz - czy nie o to właśnie nam chodziło? Przecież chcielibyśmy wyeksportować właśnie listę takich zmian. Jeśli program jest nam w stanie ją pokazać, to na pewno wie, jak przeprowadzić wymagane przez nas operacje na jej elementach. W jaki sposób odbywa się taki eksport? Należy kliknąć [PPM] na wybranej liście rewizji i z menu kontekstowego wybrać pozycję “Compare revisions”. SVN w tym momencie skomunikuje się z repozytorium i pobierze listę zmian z tychże rewizji, a w okienku wyświetli nam listę zmienionych plików:

Aby wyeksportować pliki, które zostały zmienione oraz odpowiadającą im strukturę katalogów, należy zaznaczyć wszystkie pliki [pomocny skrót klawiaturowy [Ctrl] + [A]], kliknąć [PPM] na tej liście i z menu kontekstowego wybrać pozycję “Export selection to”:

Program zapyta nas o miejsce, w którym ma umieścić wynik operacji, wybieramy więc odpowiednie położenie, zatwierdzamy i możemy cieszyć się z wyodrębnionych danych. Teraz wrzucenie ich nawet przez FTP na serwer nie będzie czymś specjalnie uciążliwym.

Podsumowanie.

Mam nadzieję, że ten wpis ułatwi Wam pracę z serwerami nie posiadającymi potrzebnych do pracy narzędzi. W informatyce zawsze istnieje jakieś alternatywne rozwiązanie, dlatego dobrze jest wiedzieć i dzielić się takimi informacjami - wielu osobom oszczędza to bardzo dużo czasu. Jeśli posiadacie wiedzę na temat innych sztuczek ułatwiających życie ludziom z branży, nie bójcie się nimi pochwalić! Być może ktoś z Was byłby chętny na napisanie wpisu gościnnego opisującego takie rozwiązanie?