Subversion System wersjonowania projektów CEZARY SOBANIEC mailto:sobaniec@cs.put.poznan.pl $Id: subversion.lyx 28 2004-03-26 08:12:57Z sobaniec $
Co to jest Subversion? Subversion jest systemem wersjonowania grup plików, umożliwia zarzadzanie wieloma współbieżnymi wersjami projektów, zastępuje CVS, usuwajac jego wady. Architektura centralne repozytorium analogia do systemu plików + przechowywanie historii wprowadzanych zmian przechowywanie dowolnych plików, również binarnych Historia 2000 CollabNet VIII 2001 źródła Subversion zarzadzane przez Subversion Subversion (1/45)
Główne cechy Subversion Wersjonowanie struktur katalogów Inaczej niż w przypadku CVS, wersjonowaniu podlegaja całe struktury katalogów. Użytkownik ma do dyspozycji nowe komendy: move i copy. Atomowe zatwierdzanie Zmiany zatwierdzane sa w całości albo w ogóle. Metadane podlegajace wersjonowaniu Do każdego pliku i/lub katalogu można przypisać dowolna liczbę własności (klucz wartość), których wartości podlegaja wersjonowaniu. Różne metody dostępu Lokalny system plików wbudowany prosty serwer moduł dla serwera Apache komunikujacy się zgodnie z protokołem WebDAV tunelowanie SSH. Subversion (2/45)
Główne cechy Subversion (cd) Jednolite przetwarzanie plików Zmiany w plikach sa przechowywane w postaci skompresowanej w taki sam sposób, bez względu na ich typ (pliki tekstowe, binarne). Efektywna komunikacja klient serwer Klient i serwer wysyłaja zawsze tylko zmiany pomiędzy wersjami plików (w CVS tylko serwer => klient). Efektywne tworzenie gałęzi pobocznych i etykietowanie Koszt utworzenia gałęzi pobocznej w projekcie jest stały i nie zależy od rozmiaru projektu (analogia do twardych dowiazań w systemie plików). Czytelny i rozszerzalny kod źródłowy Subversion to nowy projekt, tworzony od podstaw, z czytelnym i przejrzystym API gotowym do dalszej rozbudowy. Subversion (3/45)
Narzędzia Subversion Klient svn svnversion klient Subversion umożliwiajacy wprowadzanie zmian i pobieranie informacji z repozytorium. narzędzie wspomagajace do raportowania numerów wersji składowych katalogu roboczego. Serwer svnlook svnadmin svnserve mod dav syn narzędzie do pobierania różnych informacji z repozytorium. program do zarzadzania repozytorium (tworzenie, backup, itp.). samodzielny serwer zdalnego dostępu do repozytorium. moduł serwera Apache do zdalnego dostępu do repozytorium. Subversion (4/45)
Podstawowe pojęcia Repozytorium Centralny, wersjonowany system plików. Dane moga być pobierane przez dowolna liczbę klientów. Zapis do repozytorium umożliwia dostęp do nowych danych innym klientom. Repozytorium zapis odczyt odczyt Użytkownik 1 Użytkownik 2 Użytkownik 3 Subversion (5/45)
Model wersjonowania a) b) A A odczyt odczyt A A A A c) d) A A zapis A A A A zapis Subversion (6/45)
Współdzielenie plików Nadpisywanie zmian wprowadzonych przez innych użytkowników. Blokowanie dostępu do pliku (podejście pesymistyczne) Wiele blokad do odczytu, jedna blokada do zapisu. Problem nie zdjętych blokad. Nadmiarowa synchronizacja: edycja różnych fragmentów pliku tekstowego. Współbieżne, niekompatybilne zmiany w plikach zależnych od siebie. Subversion (7/45)
Współdzielenie plików (cd) Współbieżne modyfikacje (podejście optymistyczne) Replikacja danych u klientów. Zmiany pochodzace od różnych użytkowników sa przez nich integrowane i wprowadzane do repozytorium. Podejście optymistyczne: użytkownicy z reguły nie wprowadzaja konfliktowych zmian. Subversion (8/45)
Integracja zmian a) b) A A odczyt odczyt A A A A c) d) A A zapis zapis A A A A Subversion (9/45)
Integracja zmian (cd) e) f) A A odczyt A A A A A* g) h) A* A* A A* zapis odczyt A* A* Subversion (10/45)
Katalog roboczy Kopia danych z repozytorium. Zwykłe pliki, które moga być dowolnie modyfikowane. Zmiany po weryfikacji moga być wprowadzone do repozytorium. operacja commit Zmiany innych użytkowników moga być pobrane z repozytorium i integrowane z lokalna wersja projektu. operacja update Informacje zarzadzaj ace przechowywane sa w podkatalogu.svn ( svn w systemach Windows). Subversion (11/45)
Przykładowa sesja 1. Pobranie projektu z repozytorium # svn checkout svn://unixlab/proj1 # cd Proj1 # ls -a Makefile main.c const.h.svn 2. Wprowadzenie zmian do lokalnej kopi # vi main.c 3. Weryfikacja dokonanych zmian # svn status M main.c # svn diff Index: main.c =================================================================== --- main.c (revision 7) +++ main.c (working copy) 5c5,6 Subversion (12/45)
Przykładowa sesja (cd) 4. Zatwierdzenie zmian # svn commit Sending main.c Transmitting file data... Committed revision 8. 5. Pobranie innych zmian z repozytorium # svn update U const.h 6. Dodanie/usunięcie plików # svn add dane.c # svn delete const.h 7. Zmiana nazwy/lokalizacji pliku/katalogu # svn move dane.c data.c Subversion (13/45)
Adresy URL repozytoriów file:// http:// https:// svn:// svn+ssh:// bezpośredni dostęp do lokalnego repozytorium. dostęp za pośrednictwem protokołu WebDAV. podobnie jak http://, ale komunikacja jest kodowana. dostęp za pośrednictwem protokołu serwera svnserve. podobnie jak file:///, ale poprzez tunel SSH. Przykład svn+ssh://unixlab/var/svnroot/testproject ^^^^^^^^^^^ =========== fizyczny nazwa katalog projektu na serwerze Subversion (14/45)
Wersje repozytorium 0 1 2 3 4 ==================================================================================== / / / / / --Proj1 --Proj1 --Proj1 --Proj1 --Makefile --Makefile --Makefile --Makefile --main.c --main.c --main.c --main.c* --defs.h --defs.h --defs.h --defs.h --Proj2 --Proj2 --Proj2 --index.html --index.html --index.html --main.css --main.css ==================================================================================== import Proj1 import Proj2 add main.css update main.c Subversion (15/45)
Nowy projekt Przygotowanie repozytorium # svnadmin create /var/svnroot Wprowadzenie projektu do repozytorium # svn import NowyProjekt file:///var/svnroot/proj1 Adding NowyProjekt/Makefile Adding NowyProjekt/main.c Transmitting file data... Committed revision 1. Utworzenie katalogu roboczego # svn checkout file:///var/svnroot/proj1 A Proj1/Makefile A Proj1/main.c Checked out revision 1. # cd Proj1 Subversion (16/45)
Nowy projekt (cd) Utworzenie projektu i konwersja do katalogu roboczego # cd.. # svn mkdir file:///var/svnroot/proj1 # svn checkout file:///var/svnroot/proj1 # cd Proj1 # svn add Makefile main.c A Makefile A main.c # svn commit... Subversion (17/45)
Weryfikacja wprowadzonych zmian # svn status M Makefile MM main.c? defs.h Status pliku A D M C plik będzie dodany do repozytorium. plik będzie usunięty z repozytorium. plik zmodyfikowany lokalnie. konflikt pomiędzy aktualna wersja w repozytorium a wersja lokalna.? nieznany plik nie przechowywany w repozytorium.! brak pliku przechowywanego w repozytorium. Druga kolumna opisuje zmiany metadanych (własności). Subversion (18/45)
Weryfikacja wprowadzonych zmian (cd) # svn diff main.c Index: main.c =================================================================== --- main.c (revision 7) +++ main.c (working copy) @@ -2,6 +2,7 @@ int main() { - int x = 0; + int x = 1; + int y = 2 * x + 1; printf("ok\n"); if (x > 0) { Komendy status i diff nie wymagaja kontaktowania się z repozytorium. Katalog.svn zawiera kopie oryginalnych plików pobranych z repozytorium. => redukcja komunikacji kosztem większej zajętości dyskowej Subversion (19/45)
Wycofanie wprowadzonych zmian # svn revert main.c Reverted main.c Przywracana jest bazowa wersja pliku z katalogu.svn (bez kontaktu z repozytorium). Komenda revert może wycofywać operacje add i delete. Subversion (20/45)
Aktualizacja lokalnego katalogu # svn update U./main.c Updated to revision 9. Status pliku U A D R G C plik został zaktualizowany (pobrano zmiany wprowadzone do repozytorium). nowy plik został dodany do lokalnego katalogu roboczego. lokalny plik został usunięty. lokalny plik został zastapiony innym o takiej samej nazwie. zmiany z repozytorium zostały poprawnie zintegrowane z lokalnymi. zmiany z repozytorium spowodowały konflikt z lokalnymi zmianami. Subversion (21/45)
Konflikty Reakcja na konflikt 1. Sygnalizacja znakiem C. 2. Modyfikacja pliku źródłowego wskazujaca nakładajace się zmiany. 3. Utworzenie plików: plik.mine plik.roldrev plik.rnewrev Możliwe akcje oryginalny plik klienta sprzed operacji update. plik bazowy dla lokalnych modyfikacji. aktualna wersja pliku w repozytorium. 1. Ręczne usunięcie konfliktu poprzez edycję oryginalnego pliku. 2. Skopiowanie jednego z plików.mine,.roldrev,.rnewrev. 3. Wycofanie lokalnych zmian (svn revert). 4. Usunięcie plików tymczasowych: svn resolved. Subversion (22/45)
Przykład konfliktu Oryginalny plik Modyfikacje uż.1 Modyfikacje uż.2 ----------------------------------------------------------------------- #define ONE 1 #define ONE 1 #define ONE 1 #define TWO 2 #define TWO 2 #define TWO 2 #define MORE 3 #define THREE 3.---> #define OTHER 3 #define MORE 4 <---- Użytkownik 1 wprowadził zmiany do repozytorium. Użytkownik 2 wprowadził inne zmiany i aktualizuje katalog roboczy. #define ONE 1 #define TWO 2 <<<<<<<.mine <== początek konfliktu #define OTHER 3 <== wersja użytkownika 2 (moja) ======= #define THREE 3 <== wersja użytkownika 1 #define MORE 4 >>>>>>>.r8 <== koniec konfliktu Subversion (23/45)
Historia zmian # svn log ------------------------------------------------------------------------ r3 sobaniec 2004-03-08 11:15:53 +0100 (Mon, 08 Mar 2004) 1 line Algorytm iteracyjny. ------------------------------------------------------------------------ r2 kowalski 2004-03-04 14:38:09 +0100 (Thu, 04 Mar 2004) 1 line Procedura startowa. ------------------------------------------------------------------------ r1 sobaniec 2004-03-01 08:35:48 +0100 (Mon, 01 Mar 2004) 1 line Wersja początkowa. ------------------------------------------------------------------------ # svn log -r 5:8 # modyfikacje od 5 do 8 # svn log defs.h # modyfikacje dotyczące pliku defs.h # svn log -r 3 -v # szczegółowa lista plików zmieniona w wersji 3 ------------------------------------------------------------------------ r3 sobaniec 2004-03-08 11:15:53 +0100 (Mon, 08 Mar 2004) 1 line Changed paths: M /Proj1/main.c Subversion (24/45)
Historia zmian (cd) Komenda diff # svn diff -r 5 main.c # zmiany między wersją roboczą # a wersją 5 z repozytorium # svn diff -r 5:6 main.c # zmiany wprowadzone między wersją 5 i 6 # svn diff -r 5:6 svn://unixlab/proj2/main.c # obserwacja zmian bez katalogu roboczego Pobieranie starszych wersji # svn checkout -r 5... # svn update -r 5... # przejście do wersji 5 Subversion (25/45)
Inne komendy Wyświetlanie plików z repozytorium # svn cat -r 8 Makefile... Informacja o projekcie z katalogu roboczego # svn info Path:. URL: file:///var/svnroot/proj1 Repository UUID: 0ec7a80a-1dd5-0310-828f-8eb621ee5bc6 Revision: 9 Node Kind: directory Schedule: normal Last Changed Author: sobaniec Last Changed Rev: 9 Last Changed Date: 2004-03-16 22:53:24 +0100 (Tue, 16 Mar 2004) Subversion (26/45)
Inne komendy (cd) Lista plików w repozytorium # svn list # katalog roboczy Makefile main.c... # svn list file:///var/svnroot/proj2 # katalog z repozytorium index.html main.css Czyszczenie katalogu roboczego # svn cleanup Subversion (27/45)
Inne komendy (cd) Komenda blame (praise, annotate) Informacja o autorach zmian w poszczególnych liniach plików wraz z numerami wersji. # svn blame main.c 1 sobaniec #include <stdio.h> 24 kowalski #include <unistd.h> 1 sobaniec 1 sobaniec int main() { 24 kowalski int x; 12 nowak int y = 10; 24 kowalski x = getpid(); 10 kowalski printf("hello world\n"); 12 nowak printf("y=%d\n", y); 1 sobaniec } Subversion (28/45)
Właściwości (properties) Właściwości sa metadanymi Ustawienie właściwości # svn propset copyright (c) 2004 PUT II Makefile property copyright set on Makefile # svn propedit copyright Makefile Set new value for property copyright on Makefile Wyświetlenie właściwości # svn propget copyright Makefile (c) 2004 PUT II Status plików # svn status M main.c M Makefile <-- zmiana właściwości Subversion (29/45)
Właściwości (cd) Lista właściwości # svn proplist Makefile Properties on Makefile : copyright # svn proplist -v Makefile Properties on Makefile : copyright : (c) 2004 Sobaniec Usuwanie właściwości # svn propdel copyright Makefile property copyright deleted from Makefile. Uwaga: Właściwości sa wersjonowane i ich zmiany moga generować konflikty! Subversion (30/45)
Specjalne właściwości svn:executable odtwarzania prawa do wykonywania (Unix). svn:mime-type typ MIME danego pliku. Wszystkie typy MIME text/* sa traktowane jako pliki tekstowe (wykonywana jest operacja łaczenia zmian merge). svn:ignore lista wzorców plików, które maja być ignorowane użyteczne w przypadku katalogów (plik.cvsignore w CVS). svn:keywords lista identyfikatorów postaci $nazwa$ modyfikowanych podczas operacji commit. svn:eol-style sposób kodowania nowych linii: native, CR, LF, CRLF. Subversion (31/45)
Własność svn:keywords Identyfikatory $Date$ $Rev$ $Author$ $URL$ $Id$ data ostatniej modyfikacji. numer wersji repozytorium. autor ostatniej zmiany w repozytorium. adres URL dokumentu w repozytorium. skrócona wersja powyższych identyfikatorów. Przykład # svn propset svn:keywords Id Rev main.c # head -3 main.c /* * $Id: main.c 11 2004-03-18 10:01:24Z sobaniec $ */ Subversion (32/45)
Rozgałęzienia Motywacja 1.0 2.0 3.0 1.1 1.2 1.3 1.2.1 Utrzymywanie wielu równoległych wersji rozwijanego projektu. Seperacja prac o różnym satusie: rozwojowe, stabilizujace. Subversion (33/45)
Tworzenie rozgałęzienia Kopiowanie # svn copy svn://unixlab/proj svn://unixlab/proj-1.0-branch Tworzenie rozgałęzień jest operacja o niskim koszcie (zamiast kopiowania tworzone sa dowiazania). Rozgałęzienie jest kontynuacja poprzednich modyfikacji: istnieje możliwość pobierania dowolnie starszych wersji plików z gałęzi pobocznej. Subversion (34/45)
Praca z gałęzia poboczna Pobranie wersji pobocznej projektu # svn checkout svn://unixlab/proj-1.0-branch Przełaczanie między gałęziami # svn checkout svn://unixlab/proj # cd Proj # svn switch svn://unixlab/proj-1.0-branch Subversion (35/45)
Kopiowanie zmian między gałęziami Integracja zmian z gałęzi pobocznej # svn merge -r 8:10 svn://unixlab/proj-1.0-branch # svn commit -m "Integracja zmian 8:10 z gałęzi 1.0-branch" Komenda merge działa bardzo podobnie do komendy diff. Wycofywanie zmian # svn merge -r 10:8 main.c # svn merge -r HEAD:PREV main.c <= ostatnia zmiana Subversion (36/45)
Etykietowanie wersji Kopiowanie # svn copy. svn://unixlab/proj-1.0-release Kopiowanie bez katalogu roboczego # svn copy svn://unixlab/proj svn://unixlab/proj-1.0-release Nie ma różnicy między rozgałęzieniem, a etykieta zawsze kopiowanie. Konwencja nazewnicza katalogów + definicja praw dostępu. Subversion (37/45)
Skrypty Skrypty znajduja się w katalogu hooks w repozytorium. Skrypty start-commit wywoływany przed utworzeniem transakcji zgrubna weryfikacja uprawnień. Argumenty: ścieżka do repozytorium i nazwa użytkownika. pre-commit po utworzeniu transakcji, ale przed jej wykonaniem szczegółowa weryfikacja uprawnień bazujaca na nazwach plików i podkatalogów projektu. post-commit po zatwierdzeniu transakcji powiadomienie użytkowników o zmianach. Subversion (38/45)
Prawa dostępu do repozytorium Skrypt commit-access-control.pl + plik konfiguracyjny commit-access-control.cfg: [Dostęp do odczytu dla wszystkich] <= identyfikator reguły match =.* <= wyrażenie regularne access = read-only [Projekty Proj1 i Proj2] match = ^(Proj1 Proj2) access = read-write users = sobaniec [Dokumentacja projektu Proj1] match = ^Proj/Doc users = sobaniec kowalski access = read-write Subversion (39/45)
Kopia zapasowa repozytorium Kopia w formacie tekstowym # svnadmin dump /var/svnroot gzip -9 > kopia.gz Kopia binarna repozytorium # svnadmin hotcopy /var/svnroot /var/backup Kopia binarna jest zwykłym repozytorium gotowym do pracy. Subversion (40/45)
Migracja repozytorium Pobranie historii projektu # svnadmin dump /var/svnroot svndumpfilter include Proj > proj.svn Wczytanie archiwum # svnadmin load /var/svnroot < proj.svn Subversion (41/45)
Konfiguracja oprogramowania klienta Unix Lokalizacja plików konfiguracyjnych ustawienia globalne: /etc/subversion/ ustawienia lokalne: ~/.subversion/ Plik config [helpers] editor-cmd = vim [miscellany] log-encoding = iso-8859-2 enable-auto-props = yes [auto-props] *.sh = svn:executable *.bat = svn:eol-style=crlf *.c = svn:eol-style=native;svn:keywords=id Subversion (42/45)
Konfiguracja oprogramowania klienta Unix (cd) Ustawienia dotyczace sieci: plik servers [global] http-timeout = 30 [groups] inne = test.domain.pl --------------------. put = *.cs.put.poznan.pl ---. [put] <--------------------- http-proxy-host = proxy.cs.put.poznan.pl http-proxy-port = 80 http-proxy-username = sobaniec http-proxy-password = tajne http-timeout = 60 [inne] <----------------------------------... Subversion (43/45)
Konfiguracja oprogramowania klienta Unix (cd) Automatyczne uzupełnianie podkomend i przełaczników poleceń svn i svnadmin: bash# shopt -s extglob progcomp bash#. /usr/share/subversion/tools/client-side/bash completion Subversion (44/45)
Ważne adresy http://subversion.tigris.org Strona domowa projektu Subversion. http://svnbook.red-bean.com Version Control with Subversion ksiażka o Subversion. http://tortoisesvn.tigris.org/ TortoiseSVN klient Subversion dla Windows. http://www.cs.put.poznan.pl/csobaniec/papers/subversion.pdf Obecna prezentacja. http://www.cs.put.poznan.pl/csobaniec/papers/svn-refcard.pdf Subversion Quick Reference Card. Subversion (45/45)