Изменения

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

10 483 байта добавлено, 08:00, 3 июля 2012
Очередь патчей (Patch Queue) @@
<slideshow title="" style="custisnobook" scaled="true" font="Calibri, Segoe Print, cursive" headingmark="@@" centermark="%%" incmark="++" subfooter="Системы контроля версий" footer="" />
* Интерфейсы
** Commandline
** GUI: tortoise{cvs, svn, hg, git}, msysgit
** Web: viewvc, hgweb, gitweb, gerrit
** Хостинги: google code, bitbucket, github, launchpad
* MQ, патчи
* Практика
** Feature Branch
** Mercurial
** Git
* {{mag|Commit Early Commit Often}}! Хотя бы каждый день :-)
== Контроль версий @@ ==
Зачем?[[Файл: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 сервер @@ === Справедливо решили, что файлы и репозиторий вперемешку — '''TLA {{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 (2001blame); Monotone.* …умеет ветвиться и сливаться, Darcs хоть и криво.* …умеет хуки.* …имеет ГУИ — например, [http://www.tortoisecvs.org/ TortoiseCVS]. '''Однако…''' * Репозиторий {{red|пофайловый}} на основе RCS<br />{{red|☹}} версии у файлов отдельные (2003и дурацкие типа 1.128.2.5); Git<br />{{red|☹}} коммиты неатомарны* Протокол сервера неудобен* Устарел в целом (различные мелкие недостатки)*: {{gray|Маразм: порядок аргументов в командной строке влияет на результат}} === Subversion: «{{mag|CVS Done Right}}» @@ === [[File:Apache Software Foundation Logo.svg|200px|right]][[File:Subversion-logo.jpg|150px|right]]{{green|☺}} Всё поновее, Mercurial пошустрее, поудобнее (2005форматы, протоколы…)<br />{{green|☺}} Общий номер ревизии, атомарные коммиты<br />{{green|☺}} Права доступа{{mag|**}}<br />{{green|☺}} UTF-8, mime типы, свойства файлов<br />{{brown|?}} Копирование вместо веток/меток; Bazaar {{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 />(2007для конченых виндузятников)[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»''' == Распределённые 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"];* 2002—2005 — BitKeeperRCS [fillcolor="#e0ffe0"];*: ''проприетарщики такие проприетарщики''CVS [fillcolor="#e0f0ff"];*: обиделись на «реверс-инжиниринг» — команду help на сервереCVSnt [fillcolor="#e0f0ff"];* Monotone и Darcs уже тоже былиSubversion [fillcolor="#e0f0ff"];SCCS -*: но первый {{red|O(n<sup> BitKeeper [minlen=4];SCCS -3</sup> RCS [label=free)}}, style=dashed];RCS -второй {{red|O(e<sup> CVS;CVS -n</sup> 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 -> ''' (Linus Torvalds) и '''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];''' (Matt Mackall).
: [[File:Linus-torvalds-fuck-nvidia.jpg|200px]] &rArr; [[File:Git.png|100px]] &nbsp; &nbsp; &nbsp; &nbsp; [[File:Matt Mackall.jpg|145px]] &rArr; [[File:Mercurial.png|80px]] === Git и Mercurial @@ === * Git: Tracking Branches (и {{green|☺}}, и {{red|☹}})* Mercurial: Гораздо интиутивнее система команд (см. [http://www.wikivs.com/wiki/Git_vs_Mercurial сюда])* Git: {{green|В целом быстрее}}, но не всегда, плюс {{red|имеет задержки GC}}* Git: Хранит эффективнее {{green|в 1.5-2 раза}} (в нём граф объектов)* Мощность функционала {{green|<big>≈</graphbig>}}* 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|☹}} Принудительные слияния, один HEAD, пляски ревизий {{red|☹☹☹}}<br />{{green|☺}} Есть легковесные Checkout’ы а-ля SVN<br />{{red|☹}} Не умеет ASCII-графы рисовать :-D<br />{{green|☺}} Зато успешно хавает жирные текстовые файлы. === Rebase @@ === Когда не хочется или невозможно мержить. [[File:Rebase.svg]] === Очередь патчей (Patch Queue) @@ === Стандартная тема: приём сторонних патчей в свободный проект. * Вася пофиксил баг в Mercurial и ещё добавил фичу* Сказал {{mag|hg commit}} всего вместе* Отправляет Мэтту по почте результат {{mag|hg export}}* А Мэтт говорит:*# поправь {{green|вот тут}} и {{green|вот там}}*# а ещё {{red|раздели патч}} на багфикс и фичу!* {{blue|''…и что делать Васе — клонировать заново?''}} ==== На помощь идёт MQ! @@ ==== [http://mercurial.selenic.com/wiki/MqExtension/ Mercurial Queues], аналоги — [http://procode.org/stgit/ StGIT], [https://launchpad.net/bzr-loom/ bzr-loom]. Все по мотивам [http://savannah.nongnu.org/projects/quilt quilt]. Разделение патчей:
=== История Git {{mag|$ hg qimport -n feature -r .}} {{brown|# превратить текущую правку в патч}} {{blue|<...выделяем и Hg @@ ===удаляем багфикс...>}} {{mag|$ hg diff --reverse > P2}} {{mag|$ hg qrefresh}} {{brown|# из feature убран багфикс}} {{mag|$ hg qimport -n bugfix -r P2 -P}} {{brown|# создаём патч-багфикс}}
[[File:Tux.svg|200px|right]]* В 2000—2005 для ядра Linux использовался BitKeeper* Анекдотичный «реверс-инжиниринг» привёл к отзыву бесплатной лицензии* Monotone уже был, но дико медленный==== Правка патчей @@ ====
<div style="clearДля работы над одним из патчей:both"> {{mag|$ hg qpop}} {{brown|# временно убираем багфикс для работы над фичей}} {{blue|</div...вносим правки Мэтта...>}} {{mag|$ hg qrefresh}} {{brown|# сохраняем правки}} {{mag|$ hg qpush}} {{brown|# возвращаем багфикс}}
== Терминология @@ ==Если проект по пути обновится: {{mag|$ hg qpop -a; hg up; hg qpush -a}}
; Ревизия: одна версия проекта или файла.; Метка, тег (tag): символьное имя какой-либо версии проекта.; Ветка (branch): почти то Мэтт тем же самое, но ей метится множество версий.; trunk MQ импортирует (svnqimport), HEAD и принимает (cvsqfinish), master (git), mainline (bazaar): основная ветка.; Репозиторий: хранилище версий.; Рабочая копия, work copy: копия проекта, привязанная к какому-то репозиторию.; Коммит, фиксация, checkin, commit: отправка изменений в репозиторий.; Чекаут (checkout): получение версии из репозитория.; Конфликты: внесённые в одну версию ''разные'' изменения одних и тех же частей кода.; Патч: различия между файлами, пригодные к применению в автоматическом режимепатчи.