Изменения

Презентация по VCS

10 614 байтов добавлено, 14:17, 1 ноября 2013
м
Нюанс @@
<slideshow title="" style="custisnobook" scaled="true" font="Calibri, Segoe Print, cursive" headingmark="@@" centermark="%%" incmark="++" subfooter="Системы контроля версий" footer="" />== @@ ==
* Практика** Feature Branch** SVN** Mercurial** Git[[Файл:FishVCS.svg]]
== Контроль версий ==Виталий Филиппов, CUSTIS
=== Контроль версий: '''Зачем?''' @@ ===
* История Бэкап на случай утери кода<br />(или{{gray|спонсоры: rm -rf /, скажемДжамшуты, инфицирования)школоло с вирусами}}* Неблокирующие совместные правки, синхронизация* Поиск виновного (annotate/blame)
* Code review
* Поддержка старых версий
=== История VCS @@ === …по большей части свободных. <!-- <div style="margin: 10px; padding: 10px; float: left; box-shadow: 0 0 10px rgba(0,0,0,0.5); text-align: center"> --><graph>digraph rcs { rankdir = LR;ranksep = 0;bgcolor = transparent;node [fillcolor="#fff0e0", style=filled, fontname=sans, fontsize=12];edge [fontname=sans, fontsize=12]; node [shape=box, style="filled, rounded"];lvcs [label="Локальные", fillcolor="#e0ffe0"];cvcs [label="Централизованные", fillcolor="#e0f0ff"];dvcs [label="Распределённые"];lvcs -> cvcs [minlen=2];cvcs -> dvcs [minlen=2]; node [shape=plaintext, style=solid];1972 -> 1985 -> 1990 -> 1998 -> 2000 -> 2003 -> 2005 -> 2007; node [shape=oval, style=filled];SCCS [fillcolor="#e0ffe0"];RCS [fillcolor="#e0ffe0"];CVS [fillcolor="#e0f0ff"];CVSnt [fillcolor="#e0f0ff"];Subversion [fillcolor="#e0f0ff"];SCCS -> BitKeeper [minlen=4];SCCS -> RCS [label=free, style=dashed];RCS -> CVS;CVS -> Subversion [label="CVS done right", style=dashed, minlen=2];CVS -> CVSnt;Monotone -> Git [style=dashed];Monotone -> Mercurial [style=dashed];BitKeeper -> Git [style=dashed, minlen=2];BitKeeper -> Mercurial [style=dashed, minlen=2];tla [label="GNU Arch"];CVS -> tla [style=dashed, minlen=2, label="альтернатива CVS"];tla -> Baz;tla -> darcs [style=dashed];Baz -> Bazaar [style=dashed, minlen=2]; }</graph> === Терминология @@ === <tab sep="bar" class="wikitable" head="left" col2="text-align: center">Метка | tag | именованная версия проектаВетка | branch | «метка, имеющая историю развития»Репозиторий | repository | хранилище версийРабочая копия | work copy | копия проекта, связанная с репозиториемКоммит, фиксация | commit, checkin | сохранение изменений в репозиторииЧекаут, извлечение | checkout | получение рабочей копии (без истории)Push, pull | | отправка/получение изменений в/из другого репозиторияcvs HEAD<br />svn trunk<br />git master | | Основная ветка</tab> === На заметку: интерфейсы @@ === * {{mag|$ командная строка}}* Web-интерфейсы (для просмотра и поиска).* GUI, обычные и встроенные в IDE. == Локальные VCS @@ ==
Простейший вариант — вариант — архивы или папочки со старыми версиями.<br />
''(не надо так делать)''
</graph>
=== Diff, patch , merge @@ ===
[[File:Diff-screenshot.png|right|200px]]
* {{mag|diff (1970) — }} — подсчёт разницы между текстовыми файлами*: ([[rupedia:наибольшая общая подпоследовательность|Наибольшая общая подпоследовательность…алгоритм]])* patch {{mag|patch (1984) — }} — применение этих разниц — разниц — '''патчей'''*: Автор — Автор — Лэрри Уолл (он же создатель Perl’а)* {{mag|rcsmerge (1982), diff3}} (поновее) — слияние изменений
<div style="clear: both"></div>
== Централизованные VCS = Как это было в RCS @@ ===
* История версий хранится на центральном сервере* Рабочие копии создаются на компьютерах разработчиковКоманды RCS называются просто '''co''' и '''ci'''.
«Репозиторий» для каждого файла «свой» — '''CVS {{green|файл.txt,v}}''' является «репозиторием» для файла.txt. Лежит либо прямо рядом, либо в подпапке RCS.  ''{{blue|<создали файл.txt>}}'' {{mag|$ '''ci''' -t-'В этом файле содержится мудрость Господня' файл.txt}} '''{{green|файл.txt,v}}''' <-- файл.txt initial revision: 1.1 done {{mag|$ co файл.txt}} {{brown|# на посмотреть}} '''{{green|файл.txt,v}}''' --> файл.txt revision 1.1 done {{mag|$ co -l файл.txt}} {{brown|# блокируем файл (1990хотим править)}} '''{{green|файл.txt, Subversion v}}''' --> файл.txt revision 1.1 (2000locked) done {{blue|''<...правим...>''}} {{mag|$ ci -m'Мудрость исправлена' файл.txt}} '''{{green|файл.txt,v}}''' <-- файл.txt new revision: 1.2; previous revision: 1.1 done == Централизованные VCS %% @@ ==
<graph>
</graph>
== Распределённые VCS ==* История версий хранится на центральном сервере* Рабочие копии создаются на компьютерах разработчиков
'''CVS (1990), Subversion (2000).''' === CVS: прикрученный к RCS сервер @@ === Справедливо решили, что файлы и репозиторий вперемешку — '''{{red|не дело}}'''! Репозиторий теперь хранится '''отдельно''', а то и '''удалённо'''. Однако, всё равно пофайлово.  {{mag|1=$ export CVSROOT=/path/to/new/repo}} {{brown|# задаём путь к репозиторию}} {{mag|$ cvs init}} {{brown|# создаём репозиторий}} cvs init: Repository /path/to/new/repo initialised {{mag|$ cvs import module custis}} {{brown|# импорт текущей папки}} N module/file ... No conflicts created by this import {{mag|$ cvs co module}} {{brown|# извлекаем}} cvs checkout: Updating module U module/file {{blue|''<...правим файлы...>''}} cd module {{mag|$ cvs ci -m 'Сообщение об исправлении'}} cvs commit: Examining . Checking in file; '''/path/to/repo/mod/file,v''' <-- file new revision: 1.2; previous revision: 1.1 done === CVS: и даже… @@ === <div style="float: left; margin-right: 2em">[[File:TortoiseCVS.png|link=http://www.tortoisecvs.org/]]</div>* Каждая копия содержит всю историю ревизий…умеет annotate (blame).* Возможен обмен между любыми участниками…умеет ветвиться и сливаться, хоть и криво.* Лёгкость ветвления …умеет хуки.* …имеет ГУИ — например, [http://www.tortoisecvs.org/ TortoiseCVS]. '''Однако…''' * Репозиторий {{red|пофайловый}} на основе RCS<br />{{red|☹}} версии у файлов отдельные (и дурацкие типа 1.128.2.5)<br />{{red|☹}} коммиты неатомарны* Протокол сервера неудобен* Устарел в целом (различные мелкие недостатки)*: {{gray|Маразм: порядок аргументов в командной строке влияет на результат}} === Subversion: «{{mag|CVS Done Right}}» @@ === [[File:Apache Software Foundation Logo.svg|200px|right]][[File:Subversion-logo.jpg|150px|right]]{{green|☺}} Всё поновее, пошустрее, поудобнее (форматы, протоколы…)<br />{{green|☺}} Общий номер ревизии, атомарные коммиты<br />{{green|☺}} Права доступа{{mag|**}}<br />{{green|☺}} UTF-8, mime типы, свойства файлов<br />{{brown|?}} Копирование вместо веток/меток; {{green|☺}} mergeinfo Web: [[File:Viewvc-logo.png|128px|link=ViewVC]] ГУИ: [[File:RabbitVCS-rabbit.png|32px|link=http://rabbitvcs.org/]] [http://rabbitvcs.org/ RabbitVCS], [[File:TortoiseSVN-tort.png|64px|link=http://tortoisesvn.net/]] [http://tortoisesvn.net/ TortoiseSVN]<br />(для конченых виндузятников) [http://www.visualsvn.com/ VisualSVN], [http://ankhsvn.open.collab.net/ AnkhSVN] -----{{mag|**}} Благодаря оным — горячо любим компаниями, в том числе и Этой. ==== Subversion: однако… @@ ==== {{red|☹}} Нет контроля целостности<br />{{red|☹}} Не очень удобные ветвления/слияния<br />{{red|☹}} Нет ''родного'' Web-интерфейса<br />{{red|☹ (?)}} Централизованная<br />{{red|☹}} Торвальдс: '''«There is no way to do CVS right»'''
'''TLA (2001); Monotone, Darcs (2003); Git, Mercurial (2005); Bazaar (2007).'''== Распределённые VCS @@ ==
<div style="float: left; margin-right: 2em">
<graph>
digraph local {
}
</graph>
</div>
* Каждая копия содержит всю историю ревизий* Возможен обмен между любыми участниками* Лёгкость ветвления и слияния '''[http://www.gnu.org/software/gnu-arch/ TLA / GNU Arch] (2001); [http://monotone.ca/ Monotone], [http://darcs.net/ Darcs] (2003); [http://git-scm.com/ Git], [http://mercurial.selenic.com/ Mercurial] (2005); [http://bazaar.canonical.com/ Bazaar] (2007).''' [[File:GNU Arch.png|64px|link=http://www.gnu.org/software/gnu-arch/]][[File:Monotone.png|64px|link=http://monotone.ca/]][[File:Darcs.png|96px|link=http://darcs.net/]][[File:Git.png|80px|link=http://git-scm.com/]][[File:Mercurial.png|64px|link=http://mercurial.selenic.com/]][[File:Bazaar.png|64px|link=http://bazaar.canonical.com/]] <p style="text-align: right">{{red|*}} Ещё были выкидыши типа [http://svk.bestpractical.com/view/HomePage SVK]</p> <div style="clear: both"></div> === Пример ветвления — ветвления — Feature Branches %% @@ ===
Смысл: каждая доработка ''в отдельной ветке''.
[[Файл:TN-IShop-Revision-GraphСоздаются &rarr; правятся &rarr; сливаются обратно в trunk.svg]]
=== Дерево доверия ===[[Файл:TN-IShop-Revision-Graph.svg|300px]]
Можно понимать как репозитории==== Нюанс @@ ==== Слияние отменить {{red|невозможно}}!<br />{{green|&rArr;}} разрешайте конфликты в ветке «фичи», можно — как веткиа не в «мастере»[[File:CantRedoMerge.svg]] === Как можно обмениваться: дерево доверия %% @@ === (Репозитории или ветки)
<graph>
rankdir=BT;
compound=true;
bgcolor=transparent;
node [fillcolor="#e0e0e0", shape=box, style="filled,rounded", fontname=sans];
prod [fillcolor="#e0ffe0", label="Продукт"];
test [label="Проверяющий"];
test -> prod;
</graph>
=== Эмуляция централизации %% @@ ===
Можно работать с DVCS, ''почти''{{red|*}} как с централизованной!
<twopi>
digraph x {
bgcolor=transparent;
node [fillcolor="#e0e0e0", shape=box, style="filled,rounded", fontname=sans];
s [fillcolor="#ffe0e0", label="Сервер"];
{{red|*}} Вынеся за скобки отсутствие пофайловости.
== История VCS = Минусы DVCS @@ ===
…по большей части свободных.* Репозиторий пухнет*: {{blue|Хочешь Андроид? Слей 6 гигов!}}* Отсутствие пофайловости (и {{green|☺}}, и {{red|☹}})* Бывает нужно переписывать историю всех репозиториев в Москве
<!-- <div style="margin: 10px; padding: 10px; float: left; box-shadow: 0 0 10px rgba(0,0,0,0.5); text-align: center"> --><graph>digraph rcs {== Откуда ноги растут? %% @@ ===
rankdir = LR;node [fillcolor="#fff0e0", style=filled, fontname=sans];edge [fontname=sans];Из разработки ядра Linux!
node [shape=box, style="filled, rounded"];lvcs [label="Локальные", fillcolor="#e0ffe0"File:Tux.svg|100px];cvcs [label="Централизованные", fillcolor="#e0f0ff"];dvcs [label="Распределённые"];lvcs -> cvcs [minlen=2];cvcs -> dvcs [minlen=2];
node [shape=plaintext, style=solid];1972 -> 1985 -> 1990 -> 1998 -> 2000 -> 2003 -> 2005 -> 2007;== Linux @@ ====
node [shape=oval* 1992—2002: тарболлы и патчи*: ''{{green|«и это была лучшая система контроля версий, style=filled];чем CVS»}}''SCCS [fillcolor="#e0ffe0"];RCS [fillcolor="#e0ffe0"];CVS [fillcolor="#e0f0ff"];CVSnt [fillcolor="#e0f0ff"];Subversion [fillcolor="#e0f0ff"];SCCS -> * 2002—2005 — BitKeeper [minlen=4];SCCS -> RCS [label=free, style=dashed];*: ''проприетарщики такие проприетарщики''RCS *: обиделись на «реверс-> CVS;CVS -> Subversion [label="CVS done right", style=dashed, minlen=2];CVS -> CVSnt;инжиниринг» — команду help на сервере* Monotone -> Git [style=dashed];и Darcs уже тоже былиMonotone -*: но первый {{red|O(n<sup> Mercurial [style=dashed];BitKeeper -3</sup> Git [style=dashed)}}, minlen=2];BitKeeper -второй {{red|O(e<sup> Mercurial [style=dashed, minlen=2];tla [label="GNU Arch"];CVS -n</sup> tla [style=dashed, minlen=2, label="альтернатива CVS"];tla -> Baz;tla -> darcs [style=dashed];Baz -> Bazaar [style=dashed, minlen=2];)}}
}</graph>Из идей Monotone и BitKeeper родились '''Git''' (Linus Torvalds) и '''Mercurial''' (Matt Mackall).
=== История : [[File:Linus-torvalds-fuck-nvidia.jpg|200px]] &rArr; [[File:Git и Hg ===.png|100px]] &nbsp; &nbsp; &nbsp; &nbsp; [[File:Matt Mackall.jpg|145px]] &rArr; [[File:Mercurial.png|80px]]
[[File:Tux.svg|200px|right]]* В 2000—2005 для ядра Linux использовался BitKeeper* Анекдотичный «реверс-инжиниринг» привёл к отзыву бесплатной лицензии* Monotone уже был, но дико медленный=== Git и Mercurial @@ ===
<div style="clear* Git:both"Tracking Branches (и {{green|☺}}, и {{red|☹}})* Mercurial: Гораздо интиутивнее система команд (см. [http://www.wikivs.com/wiki/Git_vs_Mercurial сюда])* Git: {{green|В целом быстрее}}, но не всегда, плюс {{red|имеет задержки GC}}* Git: Хранит эффективнее {{green|в 1.5-2 раза}} (в нём граф объектов)* Мощность функционала {{green|<big></divbig>}}* Mercurial: {{blue|Python}}, вместо Gitовского микса {{red|C+Bash+Perl}}* Git: Есть [http://code.google.com/p/gerrit/ Gerrit]!
== Терминология = Bazaar @@ ===
; РевизияBazaar — творение Ubuntu (с [[lurkmore: одна версия проекта или файла.Блэкджек и шлюхи|БДж и Ш]]); Метка{{red|☹}} 1 клон = 1 ветка {{red|☹☹☹}}<br />{{red|☹}} Принудительные слияния, тег (tag)один HEAD, пляски ревизий {{red|☹☹☹}}<br />{{green|☺}} Есть легковесные Checkout’ы а-ля SVN<br />{{red|☹}} Не умеет ASCII-графы рисовать : символьное имя какой-либо версии проектаD<br />{{green|☺}} Зато успешно хавает жирные текстовые файлы.; Ветка (branch)=== Rebase @@ === Когда не хочется или невозможно мержить. [[File: почти то же самое, но ей метится множество версийRebase.svg]]; trunk === Очередь патчей (svn), HEAD (cvs), master (git), mainline (bazaarPatch Queue)@@ === Стандартная тема: основная веткаприём сторонних патчей в свободный проект.; Репозиторий* Вася пофиксил баг в Mercurial и ещё добавил фичу* Сказал {{mag|hg commit}} всего вместе* Отправляет Мэтту по почте результат {{mag|hg export}}* А Мэтт говорит: хранилище версий.; Рабочая копия*# поправь {{green|вот тут}} и {{green|вот там}}*# а ещё {{red|раздели патч}} на багфикс и фичу!* {{blue|''…и что делать Васе — клонировать заново?''}} ==== На помощь идёт MQ! @@ ==== [http://mercurial.selenic.com/wiki/MqExtension/ Mercurial Queues], work copyаналоги — [http: копия проекта//procode.org/stgit/ StGIT], привязанная к какому[https://launchpad.net/bzr-loom/ bzr-то репозиториюloom]. Все по мотивам [http://savannah.nongnu.org/projects/quilt quilt].; Коммит, фиксация, checkin, commitРазделение патчей: отправка изменений   {{mag|$ hg qimport -n feature -r .}} {{brown|# превратить текущую правку в репозиторийпатч}} {{blue|<...выделяем и удаляем багфикс...>}}; Чекаут (checkout): получение версии {{mag|$ hg diff --reverse > P2}} {{mag|$ hg qrefresh}} {{brown|# из репозиторияfeature убран багфикс}} {{mag|$ hg qimport -n bugfix -r P2 -P}} {{brown|# создаём патч-багфикс}} ==== Правка патчей @@ ==== Для работы над одним из патчей: {{mag|$ hg qpop}} {{brown|# временно убираем багфикс для работы над фичей}} {{blue|<...вносим правки Мэтта...>}}; Конфликты {{mag|$ hg qrefresh}} {{brown|# сохраняем правки}} {{mag|$ hg qpush}} {{brown|# возвращаем багфикс}} Если проект по пути обновится: внесённые в одну версию ''разные'' изменения одних и тех {{mag|$ hg qpop -a; hg up; hg qpush -a}} Мэтт тем же частей кодаMQ импортирует (qimport) и принимает (qfinish) патчи.; Патч== Заметки для себя == * Интерфейсы** Commandline** GUI: различия между файламиtortoise{cvs, пригодные к применению в автоматическом режиме.svn, hg, git}, msysgit** Web: viewvc, hgweb, gitweb, gerrit** Хостинги: google code, bitbucket, github, launchpad* MQ, патчи* Практика** Feature Branch** SVN** Mercurial** Git* {{mag|Commit Early Commit Often}}! Хотя бы каждый день :-)