…по большей части свободных.
Метка | tag | именованная версия проекта |
---|---|---|
Ветка | branch | «метка, имеющая историю развития» |
Репозиторий | repository | хранилище версий |
Рабочая копия | work copy | копия проекта, связанная с репозиторием |
Коммит, фиксация | commit, checkin | сохранение изменений в репозитории |
Чекаут, извлечение | checkout | получение рабочей копии (без истории) |
Push, pull | отправка/получение изменений в/из другого репозитория | |
cvs HEAD svn trunk git master | Основная ветка |
Простейший вариант — архивы или папочки со старыми версиями.
(не надо так делать)
SCCS (1972), RCS (1985).
Команды RCS называются просто co и ci.
«Репозиторий» для каждого файла «свой» — файл.txt,v является «репозиторием» для файла.txt. Лежит либо прямо рядом, либо в подпапке RCS.
<создали файл.txt> $ ci -t-'В этом файле содержится мудрость Господня' файл.txt файл.txt,v <-- файл.txt initial revision: 1.1 done $ co файл.txt # на посмотреть файл.txt,v --> файл.txt revision 1.1 done $ co -l файл.txt # блокируем файл (хотим править) файл.txt,v --> файл.txt revision 1.1 (locked) done <...правим...> $ ci -m'Мудрость исправлена' файл.txt файл.txt,v <-- файл.txt new revision: 1.2; previous revision: 1.1 done
CVS (1990), Subversion (2000).
Справедливо решили, что файлы и репозиторий вперемешку — не дело!
Репозиторий теперь хранится отдельно, а то и удалённо. Однако, всё равно пофайлово.
$ export CVSROOT=/path/to/new/repo # задаём путь к репозиторию $ cvs init # создаём репозиторий cvs init: Repository /path/to/new/repo initialised $ cvs import module custis # импорт текущей папки N module/file ... No conflicts created by this import $ cvs co module # извлекаем cvs checkout: Updating module U module/file <...правим файлы...> cd module $ 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
Однако…
☺ Всё поновее, пошустрее, поудобнее (форматы, протоколы…)
☺ Общий номер ревизии, атомарные коммиты
☺ Права доступа**
☺ UTF-8, mime типы, свойства файлов
? Копирование вместо веток/меток; ☺ mergeinfo
ГУИ: RabbitVCS, TortoiseSVN
(для конченых виндузятников) VisualSVN, AnkhSVN
** Благодаря оным — горячо любим компаниями, в том числе и Этой.
☹ Нет контроля целостности
☹ Не очень удобные ветвления/слияния
☹ Нет родного Web-интерфейса
☹ (?) Централизованная
☹ Торвальдс: «There is no way to do CVS right»
(Репозитории или ветки)
Можно работать с DVCS, почти* как с централизованной!
* Вынеся за скобки отсутствие пофайловости.
Из идей Monotone и BitKeeper родились Git (Linus Torvalds) и Mercurial (Matt Mackall).
Bazaar — творение Ubuntu (с БДж и Ш)
☹ 1 клон = 1 ветка ☹☹☹
☹ Принудительные слияния, один HEAD, пляски ревизий ☹☹☹
☺ Есть легковесные Checkout’ы а-ля SVN
☹ Не умеет ASCII-графы рисовать :-D
☺ Зато успешно хавает жирные текстовые файлы.
Стандартная тема: приём сторонних патчей в свободный проект.
Mercurial Queues, аналоги — StGIT, bzr-loom. Все по мотивам quilt.
Разделение патчей:
$ hg qimport -n feature -r . # превратить текущую правку в патч <...выделяем и удаляем багфикс...> $ hg diff --reverse > P2 $ hg qrefresh # из feature убран багфикс $ hg qimport -n bugfix -r P2 -P # создаём патч-багфикс
Для работы над одним из патчей:
$ hg qpop # временно убираем багфикс для работы над фичей <...вносим правки Мэтта...> $ hg qrefresh # сохраняем правки $ hg qpush # возвращаем багфикс
Если проект по пути обновится:
$ hg qpop -a; hg up; hg qpush -a
Мэтт тем же MQ импортирует (qimport) и принимает (qfinish) патчи.