«Собор или базар»: системы контроля версий — централизованные или распределенные?
Upcoming SlideShare
Loading in...5
×
 

«Собор или базар»: системы контроля версий — централизованные или распределенные?

on

  • 2,483 views

«Собор или базар»: системы контроля ...

«Собор или базар»: системы контроля
версий — централизованные или
распределенные?
Слайды к одноименному докладу на SECR-2009.

Statistics

Views

Total Views
2,483
Views on SlideShare
2,477
Embed Views
6

Actions

Likes
2
Downloads
43
Comments
0

2 Embeds 6

http://www.slideshare.net 5
http://webcache.googleusercontent.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    «Собор или базар»: системы контроля версий — централизованные или распределенные? «Собор или базар»: системы контроля версий — централизованные или распределенные? Presentation Transcript

    • «Собор или базар»: системы контроля версий — централизованные или распределенные? Стас Фомин, stas@custis.ru Заказные ИнформСистемы 29 октября 2009 г. 1 / 86
    • Version Control System/Revision Control System ПО для работы с изменяемыми информационными объектами: хранение версий программных артефактов: программных кодов; документов и документации в целом; моделей САПР. мгновенный доступ к любой версии; обеспечение совместной работы команды. 2 / 86
    • Классы систем управления версиями Системы управления версиями 3 / 86
    • Классы систем управления версиями Системы управления версиями Однопользовательские Многопользовательские 4 / 86
    • Однопользовательские 1 создать проект Computer Created by Andrew Fitzsimon 2 запись изменений 3 просмотр истории 4 выпуск версий 5 / 86
    • Классы систем управления версиями Системы управления версиями Однопользовательские Многопользовательские 6 / 86
    • Классы систем управления версиями Системы управления версиями Однопользовательские Многопользовательские Не актуальны! 7 / 86
    • Классы систем управления версиями Системы управления версиями Однопользовательские Многопользовательские Не актуальны! Централизованные (СVCS) Распределенные (DVCS) 8 / 86
    • Классы систем управления версиями Системы управления версиями Однопользовательские Многопользовательские Не актуальны! Централизованные (СVCS) Распределенные (DVCS) Наша тема! 9 / 86
    • Миниглоссарий СУВ repository Хранилище документов — место, где система управления версиями хранит все документы вместе с историей их изменения и другой служебной информацией. revision Версия документа. СУВ различают версии по номерам/меткам, которые назначаются автоматически. workspace Рабочая/локальная копия документов (working copy ). 10 / 86
    • Централизованный Repository и Workspaces Репозиторий Repository 11 / 86
    • Централизованный Repository и Workspaces Рабочая станция «A» (Windows) Репозиторий Workspace 1: c:projectssupercode Repository 12 / 86
    • Централизованный Repository и Workspaces Рабочая станция «A» (Windows) Workspace 1: c:projectssupercode Репозиторий Рабочая станция «B» (Linux) Repository Workspace 4: /usr/share/supercode 13 / 86
    • Централизованный Repository и Workspaces Рабочая станция «A» (Windows) Workspace 1: c:projectssupercode Репозиторий Workspace 2: c:projectsbugfixes Repository Рабочая станция «B» (Linux) Workspace 4: /usr/share/supercode 14 / 86
    • Централизованный Repository и Workspaces Рабочая станция «A» (Windows) Workspace 1: c:projectssupercode Workspace 2: c:projectsbugfixes Репозиторий Repository Workspace 3: c:projectsexperimental Рабочая станция «B» (Linux) Workspace 4: /usr/share/supercode 15 / 86
    • Централизованный Repository и Workspaces Рабочая станция «A» (Windows) Workspace 1: c:projectssupercode Workspace 2: c:projectsbugfixes Репозиторий Workspace 3: c:projectsexperimental Repository Рабочая станция «B» (Linux) Workspace 4: /usr/share/supercode Workspace 5: /usr/share/test-supercode 16 / 86
    • Централизованный Repository и Workspaces Рабочая станция «A» (Windows) Workspace 1: c:projectssupercode Workspace 2: c:projectsbugfixes Workspace 3: c:projectsexperimental Репозиторий Рабочая станция «B» (Linux) Repository Workspace 4: /usr/share/supercode Workspace 5: /usr/share/test-supercode Рабочая станция «C» (Mac OS) Workspace 6 17 / 86
    • Базовые операции CVCS checkout Извлечение данных из хранилища и создание рабочей копии. Возможно заказать определенные версий. update Обновление рабочей копии из репозитория. Можно переключится на другие версии. commit Создание новой версии, публикация изменений. Распространение изменений, сделанных в рабочей копии, на репозиторий. В хранилище создаётся новая версия. 18 / 86
    • Централизованные системы Привычная всем схема! Computer Created by Andrew Fitzsimon 2 update 1 checkout Computer Created by Andrew Fitzsimon Server 3 commit 19 / 86
    • В CVCS версии линейно растут 20 / 86
    • Ветки и метки branch Ветки — параллельные процессы эволюции кода. Одинаковая историю до точки ветвления и разная — после неё. Например, удобно держать отдельные ветки для учета багов в выпущенных версиях или проверки экспериментальных идей. Сливают ветки между собой, или с основным стволом разработки. tag Метка — символическое имя для версии. Замороженная ветка. Branches 6 9 11 15 16 Merges 2 3 7 8 Discontinued development branch 1 4 10 12 14 Trunks 5 Tags 13 21 / 86
    • Базовые операции DVCS Принцип Хоттабыча — каждому по репозиторию! commit Фиксация новой версии в своем репозитарии. pull Загрузка изменений от кого-то в отдельную ветку. push Передача изменений кому-то в отдельную ветку. merge Слияние изменений из двух веток. branch Ветвление репозитория. 22 / 86
    • Распределенные системы — швейцарский нож Можно работать в одиночку без серверов! 1 создать проект Computer Created by Andrew Fitzsimon 2 запись изменений 3 просмотр истории 4 выпуск версий 23 / 86
    • Распределенные системы — швейцарский нож Можно по старинке — с центральным сервером! Computer Created by Andrew Fitzsimon 2 update 1 checkout Computer Created by Andrew Fitzsimon Server 3 commit 24 / 86
    • Распределенные системы — швейцарский нож Можно без центрального сервера — произвольная схема обмена изменениями! 1 запуск проект 2 клонирование-ветвление Computer Computer Created by Andrew Fitzsimon Created by Andrew Fitzsimon фиксируемые фиксируемые 3 3 правки правки слияние слияние 4 4 изменений изменений с товарищем с товарищем 25 / 86
    • Распределенные системы — швейцарский нож Можно с центральным сервером, с локальными фиксациями и ветками, и отдельной стратегией публикации и слияний. Computer 2 pull merge Created by Andrew Fitzsimon основной ствол 1 branch Computer Created by Andrew Fitzsimon Server 3 commit локальные ветки 26 / 86
    • История управления конфигурациями 1970 Исследования Leon Pressor (ВПК), появился «make». 1972 Bell Labs: алгоритм «diff», первая система контроля версий «SCCS». 1980 «RCS» (Revision Control System), утилита «patch». 1986 «CVS» (Concurrent Version System), первая распределенная СУВ. 2000 CollabNet — начало работ над «Subversion». 200x появились работоспособные распределенные СУВ: «BitKeeper», «GNU arch». 2009 Разборки между лидерами: SVN, GIT, Mercurial. Но еще много legacy-систем, например CVS. 27 / 86
    • История управления конфигурациями 1970 Исследования Leon Pressor (ВПК), появился «make». 1972 Bell Labs: алгоритм «diff», первая система контроля версий «SCCS». 1980 «RCS» (Revision Control System), утилита «patch». 1986 «CVS» (Concurrent Version System), первая распределенная СУВ. 2000 CollabNet — начало работ над «Subversion». 200x появились работоспособные распределенные СУВ: «BitKeeper», «GNU arch». 2009 Разборки между лидерами: SVN, GIT, Mercurial. Но еще много legacy-систем, например CVS. 28 / 86
    • История управления конфигурациями 1970 Исследования Leon Pressor (ВПК), появился «make». 1972 Bell Labs: алгоритм «diff», первая система контроля версий «SCCS». 1980 «RCS» (Revision Control System), утилита «patch». 1986 «CVS» (Concurrent Version System), первая распределенная СУВ. 2000 CollabNet — начало работ над «Subversion». 200x появились работоспособные распределенные СУВ: «BitKeeper», «GNU arch». 2009 Разборки между лидерами: SVN, GIT, Mercurial. Но еще много legacy-систем, например CVS. 29 / 86
    • История управления конфигурациями 1970 Исследования Leon Pressor (ВПК), появился «make». 1972 Bell Labs: алгоритм «diff», первая система контроля версий «SCCS». 1980 «RCS» (Revision Control System), утилита «patch». 1986 «CVS» (Concurrent Version System), первая распределенная СУВ. 2000 CollabNet — начало работ над «Subversion». 200x появились работоспособные распределенные СУВ: «BitKeeper», «GNU arch». 2009 Разборки между лидерами: SVN, GIT, Mercurial. Но еще много legacy-систем, например CVS. 30 / 86
    • История управления конфигурациями 1970 Исследования Leon Pressor (ВПК), появился «make». 1972 Bell Labs: алгоритм «diff», первая система контроля версий «SCCS». 1980 «RCS» (Revision Control System), утилита «patch». 1986 «CVS» (Concurrent Version System), первая распределенная СУВ. 2000 CollabNet — начало работ над «Subversion». 200x появились работоспособные распределенные СУВ: «BitKeeper», «GNU arch». 2009 Разборки между лидерами: SVN, GIT, Mercurial. Но еще много legacy-систем, например CVS. 31 / 86
    • История управления конфигурациями 1970 Исследования Leon Pressor (ВПК), появился «make». 1972 Bell Labs: алгоритм «diff», первая система контроля версий «SCCS». 1980 «RCS» (Revision Control System), утилита «patch». 1986 «CVS» (Concurrent Version System), первая распределенная СУВ. 2000 CollabNet — начало работ над «Subversion». 200x появились работоспособные распределенные СУВ: «BitKeeper», «GNU arch». 2009 Разборки между лидерами: SVN, GIT, Mercurial. Но еще много legacy-систем, например CVS. 32 / 86
    • История управления конфигурациями 1970 Исследования Leon Pressor (ВПК), появился «make». 1972 Bell Labs: алгоритм «diff», первая система контроля версий «SCCS». 1980 «RCS» (Revision Control System), утилита «patch». 1986 «CVS» (Concurrent Version System), первая распределенная СУВ. 2000 CollabNet — начало работ над «Subversion». 200x появились работоспособные распределенные СУВ: «BitKeeper», «GNU arch». 2009 Разборки между лидерами: SVN, GIT, Mercurial. Но еще много legacy-систем, например CVS. 33 / 86
    • История управления конфигурациями 1970 Исследования Leon Pressor (ВПК), появился «make». 1972 Bell Labs: алгоритм «diff», первая система контроля версий «SCCS». 1980 «RCS» (Revision Control System), утилита «patch». 1986 «CVS» (Concurrent Version System), первая распределенная СУВ. 2000 CollabNet — начало работ над «Subversion». 200x появились работоспособные распределенные СУВ: «BitKeeper», «GNU arch». 2009 Разборки между лидерами: SVN, GIT, Mercurial. Но еще много legacy-систем, например CVS. 34 / 86
    • Эволюция систем контроля версий SCCS:1972 35 / 86
    • Эволюция систем контроля версий SCCS:1972 RCS:1980 36 / 86
    • Эволюция систем контроля версий SCCS:1972 RCS:1980 CVCS 37 / 86
    • Эволюция систем контроля версий SCCS:1972 RCS:1980 CVCS CVS:1985 38 / 86
    • Эволюция систем контроля версий SCCS:1972 RCS:1980 CVCS CVS:1985 CVSNT:1998 39 / 86
    • Эволюция систем контроля версий CVSNT:1998 SCCS:1972 RCS:1980 CVCS CVS:1985 SVN:2000 40 / 86
    • Проблемы CVS решенные в SVN + Каталоги + Транзакции + Модификации имён файлов + Метаданные (Свойства/properties) + Блокировки + Эффективность клиент-серверного обмена + Эффективность хранения двоичных файлов + Эффективность создания ветвей и меток + Эффективность использования памяти сервера 41 / 86
    • Эволюция систем контроля версий CVSNT:1998 SCCS:1972 RCS:1980 CVCS CVS:1985 SVN:2000 42 / 86
    • Эволюция систем контроля версий CVSNT:1998 CVCS CVS:1985 SCCS:1972 RCS:1980 SVN:2000 DVCS 43 / 86
    • Эволюция систем контроля версий CVSNT:1998 CVCS CVS:1985 SCCS:1972 RCS:1980 SVN:2000 DVCS arch:2001-2007 Monotone:200x 44 / 86
    • Эволюция систем контроля версий CVSNT:1998 CVS:1985 CVCS SVN:2000 SCCS:1972 RCS:1980 arch:2001-2007 DVCS Monotone:200x BitKeeper:2001 45 / 86
    • Эволюция систем контроля версий CVSNT:1998 CVS:1985 SVN:2000 CVCS SCCS:1972 RCS:1980 arch:2001-2007 Darcs:2003-2007 DVCS Monotone:200x BitKeeper:2001 46 / 86
    • Эволюция систем контроля версий CVSNT:1998 CVS:1985 SVN:2000 CVCS SCCS:1972 RCS:1980 arch:2001-2007 Darcs:2003-2007 DVCS Monotone:200x GIT:2005 BitKeeper:2001 47 / 86
    • Эволюция систем контроля версий CVSNT:1998 CVS:1985 SVN:2000 CVCS SCCS:1972 RCS:1980 arch:2001-2007 Darcs:2003-2007 DVCS BitKeeper:2001 GIT:2005 Monotone:200x Mercurial:2005 48 / 86
    • Эволюция систем контроля версий CVSNT:1998 CVS:1985 SVN:2000 CVCS Darcs:2003-2007 SCCS:1972 RCS:1980 arch:2001-2007 DVCS Bazaar:2005 BitKeeper:2001 GIT:2005 Monotone:200x Mercurial:2005 49 / 86
    • Эволюция систем контроля версий CVSNT:1998 CVS:1985 SVN:2000 CVCS Darcs:2003-2007 SCCS:1972 RCS:1980 arch:2001-2007 Bazaar:2005 DVCS BitKeeper:2001 GIT:2005 Monotone:200x Mercurial:2005 50 / 86
    • Эволюция систем контроля версий CVSNT:1998 CVS:1985 SVN:2000 CVCS Darcs:2003-2007 SCCS:1972 RCS:1980 arch:2001-2007 Bazaar:2005 DVCS BitKeeper:2001 GIT:2005 Monotone:200x Mercurial:2005 51 / 86
    • Эволюция систем контроля версий CVSNT:1998 CVS:1985 SVN:2000 CVCS Darcs:2003-2007 SCCS:1972 RCS:1980 arch:2001-2007 Bazaar:2005 DVCS BitKeeper:2001 GIT:2005 Monotone:200x Mercurial:2005 52 / 86
    • Subversion — венец централизованных СУВ The Forrester WaveTM : Software Change And Configuration Management, Q2 2007 IBM Is The Unified SCCM Front-Runner, Subversion Leads On Standalone SCM. Risky Strong Bets Contenders Performers Leaders Strong Go online to download the Forrester Wave tool Borland for more detailed product Serena Dimensions Software Subversion evaluations, feature Perforce comparisons, and MKS IBM customizable rankings. CA Telelogic Current o ering AccuRev Microsoft Serena PVCS Market presence Full vendor participation Incomplete vendor participation Weak Weak Strategy Strong 41388 Source: Forrester Research, Inc. 53 / 86
    • Опрос на портале habrahabr.ru 26-27 октября 2009 54 / 86
    • Опрос на портале habrahabr.ru 26-27 октября 2009 55 / 86
    • Опрос на портале habrahabr.ru 26-27 октября 2009 56 / 86
    • Опрос на портале habrahabr.ru ? 26-27 октября 2009 57 / 86
    • Война DVCS vs. CVCS! 58 / 86
    • Война DVCS vs. CVCS! Линус Торвальдс: Когда я сказал, что страстно ненавижу CVS, я должен также сказать, что если в аудитории есть пользователи SVN, то вы, возможно, захотите уйти. Поскольку моя ненависть к CVS означает, что я считаю Subversion самым бесцельным проектом, так как основной девиз Subversion некоторое время был «Сделанный по-уму CVS» или что-то вроде этого. А если вы начинаете с такого слогана, то вы никуда не сможете прийти. Это так, потому что CVS невозможно сделать «правильным». 59 / 86
    • Война DVCS vs. CVCS! Линус Торвальдс: А сейчас я рассказываю свое единственно правильное мнение, так что пользователи CVS, если вы действительно его так любите, уйдите с глаз моих долой. Вам надо обратиться в психушку или куда-то еще. Поэтому, например, я Subversion даже трехметровым багром трогать не буду. В Subversion большой репозиторий, куда все обязаны складывать свои данные. А централизованная модель просто не работает, когда. . . давайте взглянем на некоторые такие случаи. 60 / 86
    • Война DVCS vs. CVCS! Ben Collins-Sussman: . . . Смотрите, что хочет сделать этот счастливчик — уползти в пещеру, неделями в одиночку корпеть над сложной функциональностью, а затем воткнуть «вылизанное» решение в «основной ствол» проекта. . . В нашем Subversion-сообществе такое поведение мы именуем «сбрасывание бомбы» . . . 61 / 86
    • Война DVCS vs. CVCS! Линус Торвальдс: Ветки полностью бесполезны, если Вы не объединяете их, а CVS не может объединить вообще ничего. Вы можете слить изменения однажды, но тогда CVS забывает то, что вы сделали, и вы никогда не сможете объединять снова, не получая адские конфликты. Слияния в Subversion — полная беда. . . . Невероятно, насколько эти люди глупы. Они все время смотрели на проблему неверно. Проблема-то не в ветвлении, а в слиянии! Branches 6 9 11 15 16 Merges 2 3 7 8 Discontinued development branch 1 4 10 12 14 Trunks 5 Tags 13 62 / 86
    • 63 / 86
    • Война DVCS vs. CVCS! Ben Collins-Sussman: Итак, есть два «класса» программистов-разработчиков, назовем их «20%» и «80%». основная движущая сила индустрии программного обеспечения — это «80%»-ные парни. . . . Их знаний в точности достаточно, чтобы сделать свою работу, затем пойти домой на выходные и забыть о компьютерах. . . . Жуткая правда №1 — Основной объем . . . ПО — создается вышеупомянутыми «80%» программистов. Жуткая правда №2 — Большинство «альфа-гиков» забывают «жуткую правду №1». 64 / 86
    • Война DVCS vs. CVCS! Ben Collins-Sussman: Большинство из 80% кодеров даже в TortoiseSVN обнаруживают кучу «новых и интригующих» концепций, таких как «update» и «commit». Им вообще трудно использовать контроль версий, а вы собираетесь объяснять им разницу между «pull» и «update», и между «commit» и «push»? Собираетесь? Смотрите мне в глаза и попробуйте еще раз повторить это c серьезной мордой лица. 65 / 86
    • Война DVCS vs. CVCS! Линус Торвальдс: Например, я думаю, что большинство из вас полностью некомпетентны. Основной принцип распределенности — это то, что я не должен вам доверять. Я не должен давать вам доступ к коммитам. . . . Мне нужно доверять только 5, 10, ну может 15 людям. Если у меня есть доверенная сеть, в которую входят эти 5/10/15 выдающихся человек, и я знаю, что они выдающиеся, я могу забирать новый код у них. И мне не надо париться на эту тему. 66 / 86
    • Интеграция Ядра Линукса Линус 67 / 86
    • Интеграция Ядра Линукса pull Лейтенант 1 (USB) pull Линус Лейтенант 2 (Сеть) pull Лейтенант 3 (Память) 68 / 86
    • Интеграция Ядра Линукса Доверенный 1/1 pull pull pull Лейтенант 1 (USB) Доверенный 1/2 pull pull Линус Лейтенант 2 (Сеть) Доверенный 1/3 pull Лейтенант 3 (Память) 69 / 86
    • Интеграция Ядра Линукса Доверенный 1/1 pull pull Доверенный 1/2 Лейтенант 1 (USB) pull Доверенный 1/3 pull pull Доверенный 2/1 pull Линус Лейтенант 2 (Сеть) pull pull pull Доверенный 2/2 Лейтенант 3 (Память) Доверенный 2/3 70 / 86
    • Интеграция Ядра Линукса Доверенный 1/1 pull pull Доверенный 1/2 Лейтенант 1 (USB) pull Доверенный 1/3 pull Доверенный 2/1 pull pull pull Линус Лейтенант 2 (Сеть) Доверенный 2/2 pull pull Доверенный 2/3 pull Доверенный 3/1 Лейтенант 3 (Память) pull pull Доверенный 3/2 Доверенный 3/3 71 / 86
    • Интеграция Ядра Линукса Доверенный 1/1 pull pull Доверенный 1/2 Лейтенант 1 (USB) pull Доверенный 1/3 pull Доверенный 2/1 pull pull pull Линус Лейтенант 2 (Сеть) Доверенный 2/2 pull pull Доверенный 2/3 pull Доверенный 3/1 Лейтенант 3 (Память) pull pull Доверенный 3/2 Доверенный 3/3 72 / 86
    • Базар! Надо себя «продавать»! 73 / 86
    • Собор или Базар? 74 / 86
    • Плюсы DVCS + Работа оффлайн + Очень быстро коммитить + Очень быстро копаться в истории + Один пользователь/много машин («конфигурации») + Поддержка шизофрении полифонии веток с легкими слияниями 75 / 86
    • Минусы DVCS − Нельзя ограничить доступ на чтение − Нельзя работать с частью репозитория − Большие репозитарии («начальное клонирование») − Нет блокировки бинарников для целостности − «Кодовые бомбы» − Трудно контролировать! Нет единой шкалы версий! − Отстает интеграция с IDE, поисковыми и вебсистемами. − Непросто с практикой Continuous Integration 76 / 86
    • DVCS & CI — OK 77 / 86
    • DVCS & CI — NOT OK 78 / 86
    • Минусы СVCS − Скорость слияний и коммитов зависит от сети − Невозможна работа оффлайн − Жалко тратить общий репозиторий под [жирную] фигню. − Нет легких слияний! 79 / 86
    • Плюсы СVCS (SVN) + OK с бинарниками (блокировки). + Идеально для Continuous Integration + Максимальная известность и понятность. + Идеально для мониторинга, code-review, контроля (ViewVC). + Матерая — интеграция со всем. Полно ништяков! + SVNSearcher — полнотекстовый поиск — база знаний! 80 / 86
    • Что выбрать? Наш ответ на сегодня: Централизованный SVN-репозиторий. Удовлетворит «80%» (на самом деле 99%). «20%» гиков — разрешить использовать DVCS, умеющую работать с SVN: Bazaar (bzr-svn)1 ; Mercurial GIT (git-svn); IMHO, на самый крайний случай! и запретить отбиваться от коллектива. 1 эта презентация сделана с использованием bzr-svn 81 / 86
    • Что выбрать? Наш ответ на сегодня: Централизованный SVN-репозиторий. Удовлетворит «80%» (на самом деле 99%). «20%» гиков — разрешить использовать DVCS, умеющую работать с SVN: Bazaar (bzr-svn)1 ; Mercurial GIT (git-svn); IMHO, на самый крайний случай! и запретить отбиваться от коллектива. 1 эта презентация сделана с использованием bzr-svn 82 / 86
    • Что выбрать? Наш ответ на сегодня: Централизованный SVN-репозиторий. Удовлетворит «80%» (на самом деле 99%). «20%» гиков — разрешить использовать DVCS, умеющую работать с SVN: Bazaar (bzr-svn)1 ; Mercurial GIT (git-svn); IMHO, на самый крайний случай! и запретить отбиваться от коллектива. 1 эта презентация сделана с использованием bzr-svn 83 / 86
    • Что выбрать? Наш ответ на сегодня: Централизованный SVN-репозиторий. Удовлетворит «80%» (на самом деле 99%). «20%» гиков — разрешить использовать DVCS, умеющую работать с SVN: Bazaar (bzr-svn)1 ; Mercurial GIT (git-svn); IMHO, на самый крайний случай! и запретить отбиваться от коллектива. 1 эта презентация сделана с использованием bzr-svn 84 / 86
    • В любом случае, посадите ваших технологов изучать DVCS. The time is now! 85 / 86
    • Наши переводы статей о системах контроля версий: lib.custis.ru/index.php/VCSs Наши семинары по эффективной разработке: team.custis.ru ВАШИ ВОПРОСЫ? 86 / 86