220 likes | 372 Views
Георги Пенков. Българска асоциация на разработчиците на софтуер. www.devbg.org. Opensource софтуерни хранилища. CVS - Concurent Versioning System. Въведение. SVN – Subversion Появява се през 2000г. Сред дизайнерите е и авторът на книгата ”Open Source Development with CVS”
E N D
Георги Пенков Българска асоциация на разработчиците на софтуер www.devbg.org Opensource софтуерни хранилища CVS - Concurent Versioning System
Въведение SVN – Subversion Появява се през 2000г. Сред дизайнерите е и авторът на книгата ”Open Source Development with CVS” Създаден с цел: да прилича на CVS да избегне ограниченията на CVS Резултатът е мощна, лесна за използване и гъвкава система за софтуерно хранилище
Subversion предоставя История (versioning) на директорийната структура Пълна история на всички промени изтриване на файлове и директории преименуване на файлове и директории заменяне на файлове и директории Може да работи както самостоятелно, така и интегриран с Apache като модул Алгоритъмът за запазване на разликите между ревизиите работи еднакво добре с текстови и двоични файлове Файловете се съхраняват компресирани в хранилището Работи ефективно с разклонения(branches) и етикети(tag)
Програмно обкръжение на SVN svn – инструмент за достъп от командния ред svnversion – програма, която дава информация за състоянието (в смисъл на ревизии и т.н.) на работното копие. svnlook – инструмент за преглед на Subversion хранилището svnadmin – инструмент за администрация на хранилището svndumpfilter – инструмет за създаване на dump-ове на хранилището mod_dav_svn – модул за Apache HTTP Server, който прави хранилището достъпно през web svnserve – самостоятелно сървърно приложение, което може да работи както отделно, така и в комбинация със SSH
Създаване на хранилище С помоща на командата create В SVN понятието project не съществува Хранилището е просто едно голямо файлово дърво, за което се пази пълна история на промените $ svnadmin create /path/to/repos $ ls /path/to/repos conf/ dav/ db/ format hooks/ locks/ README.txt
Въвеждане на проект в хранилището Препоръчителен формат на директорията на проекта преди импорт: Формат на командата за импорт: /tmp/myproject/branches/ /tmp/myproject/tags/ /tmp/myproject/trunk/ foo.c bar.c Makefile … svn import /tmp/myproject file:///path/to/repos/myproject/trunk -m "initial import"
Създаване на локално копие С помоща на командата checkout: Пътя до хранилището е винаги URL $ svn checkout file:///path/to/repos/myproject/trunk myproject A myproject/foo.c A myproject/bar.c A myproject/Makefile … Checked out revision 1.
Запазване на промените. Commit Подобно на CVS със командата commit Всички commit операции са атомарни За разлика от CVS ревизиите са общи за дървото на проекта Номерът на ревизиятаидентифицира цялотодърво в даден моментот разработката
Ревизии в SVN Въпреки, че в хранилището версията е за цялото дърво, в локалното копие може да има файлове с различни ревизии Операция commit почти винаги създава локално копие с различни ревизии на файловете Файловете, които са били запазени при последния commit в хранилището, са с най-висок номер на ревизия спрямо останалите в локалното копие Файловете от локалното копие ще придобият една обща ревизия при следващия update С други думи – commit и update са абсолютно независими операции
Ревизии в SVN. Пример Локалното копие може да съдържа файлове с различна ревизия след нанасяне на промени: Ако друг програмист промени междувременно някой файл, след update ревизиите ще изглеждат така: calc/Makefile:4 integer.c:4 button.c:5 calc/Makefile:6 integer.c:6 button.c:6
Преглед на информация за ревизиите С помоща на ”svn status –verbose” получаваме информация за ревизията на локалното копие и отделните ревизии на файловете. Допълнително ”svn –show-updates” ни показва кой файл има нужда от update: С помоща на ”svn log” може да получаваме история на ревизиите както общо за локално копие, така и само за даден файл: 3 3 user . 5 5 user new.txt M 3 2 user README.txt ------------------------------------------------------------------------ r2 | user | 2006-09-21 17:13:00 +0300 (Thu, 21 Sep 2006) | 1 line some commit
Ключови думи за ревизии SVN поддържа специални ключови думи за обозначаване на някои ”специални” ревизии: HEAD – най-новата ревизия в хранилището BASE – ревизията, която е имало локалното копие преди нанасяне на промени COMMITED – номер на ревизията при последното съхранение в хранилището. Равна или по-малка от BASE PREV – номер на предната ревизия преди тази, която е била съхранена при последния commit За да бъдат използвани с подава параметър --revision При работа с нелокално URL може да се ползва само HEAD
Операция update и статуси Операция update работи по начин подобен на този при CVS като SVN ни известява за резултата със следните статуси: U foo – файл foo е бил променен (с промени от хранилището). A foo – файл или директория foo са били добавени в работно копие. D foo – файл или директория foo са били изтрити. R foo – файл или директория foo е бил заменен с друг такъв със същото име. G foo – файл foo е получил промени от хранилището, но локалното копие е било също променено. Или промените не са се засичали, или са били същите като локалното копие. C foo – има конфликт с файла foo. Той трябва да бъде разрешен ръчно.
Разрешаване на конфликти Ако конфликтът е в текстов файл, SVN поставя маркери около конфликтните части. Допълнително SVN създава няколко допълнителни файла със специални разширения: filename.mine – това е локалното копие на файла, по начина по който е изглеждал преди да бъде извършена операция update filename.rOLDREV – това е файла с BASE ревизията, т.е. файла който е бил изтеглен от хранилището преди нанасяне на примени fename.rNEWREV – това е варианта с HEAD ревизия, който отговаря на най-новата ревизия от хранилището. Commit не е възможен, ако допълнителните файлове са налични и докато не бъде изпълнена команда resolved - ”svn resolved conflicted.file.ext”
Преглед на файлове Команда list – позволява преглед на списъка на файловете от дадена директория в хранилището, без да бъдат изтегляни Параметър -v за повече информация Команда cat – позволява лесно преглеждане на съдържанието на даден файл В комбинация с --revision параметър, cat и list дават възможност за преглеждане на точно определена ревизия на дадения файл
Разклонения Разклоненията в SVN се реализират, като се копира директорията, която искаме да разклоним. Копиране на файлове и директории в хранилището става с команда copy. След използвне на copy трябва да отразим промените с commit: host$ svn copy trunk branches/my-calc-branch host$ svn status A + branches/some_branch $ svn commit Adding branches/some_branch Adding branches/some_branch/file.txt ...
Ефект върху хранилището При операция copy не се прави директно копие на цялото дърво. Използва се подход подобен на създаването на hard-link. Реално нарастване на хранилището ще има едва след нанасяне на промени върху даден файл от разклонението Методът често се нарича ”cheap copies”
Сливане Операцията сливане е много подобна на diff Разликите между сравнявание версии обаче се сливат директно в работното копие: За разлика от diff, merge очаква път до мястото, където да бъде записано слятото копие. $ svn merge -r 343:344 http://svn.example.com/repos/calc/trunk U integer.c $ svn status M integer.c
Архивни копия със svnadmin Сваляне на архивно копие (dump): Възстановяване на архивно копие (load) host$ svnadmin dump /path/to/repos > repos-dumpfile host$ svnadmin load /usr/local/svn/restored < repos-backup <<< Started new txn, based on original revision 1 * adding path : test ... done. * adding path : test/a ... done. …
Други възможности Hook Scripts – тригери при някои основни операции Properties svnserve – самостоятелен сървър. метод за достъп svn:// метод за достъп ssh+svn:// Apache 2.0 WebDAV модул host$ svn propset propname 'property content' path/to/file.ext host$ svn checkout http://host.example.com:7382/repos/project
Заключение Въпроси и коментари ?