1. Ключевые слова правок
HEAD -- Последняя (или «самая новая») правка в удаленном репозитории
BASE -- Номер правки элемента в рабочей копии. Последняя ревизиция, которая была получена из репозитория. Если элемент редактировался, то «BASE версия» соответствует тому, как выглядел этот элемент до внесения локальных изменений.
COMMITTED -- Правка, в которой элемент последний раз изменялся (предшествующая либо равная BASE).
PREV -- Правка, непосредственно предшествующая той правке, в которой элемент был последний раз изменен. (То есть, фактически, COMMITTED - 1)
2. Обшие замечания
У команды svn diff в различных формах последовательность ревизий идёт по порядку как "old new"
Форматы схем-протоколов для доступа к svn:
** file:// --прямой доступ к хранилищу
** svn://, svn+ssh//-- через внутренний механизм svnserver без/с ssh соединением.
** http://, https://-- доступ через надстройку (Apache) к хранилищу через http или webdav.
3. Diff команды
4. Update команды
svn update --revision PREV foo.c
отменить последние изменения в foo.c, понизив рабочую правку foo.c
Дата в качестве ревизии. Когда вы указываете дату, Subversion находит в хранилище наиболее близкую правку.
svn checkout -r {"2006-02-17 15:30"}
5. Команды работы с ветками
svn cp $trunk $bb/testing
svn merge -r 303:302 http://svn.example.com/repos/calc/trunk
svn merge http://svn.example.com/som_branch --reintegrate
svn copy --revision 807 http://svn.example.com/repos/calc/trunk/real.c ./real.c dstPath
svn switch
svn delete http://example/branches/my-calc-branch -m "Removing obsolete branch of calc project."
svn copy -r 374 http://svn.example.com/branches/my-calc http://svn.example.com/branches/my-calc
svn merge --dry-run -r 343:344 http://svn.example.com/repos/calc/trunk
Пример вмерживания в ветку нескольких коммитов
Пример вмерживания коммита в ветку
Создание ветки.
Изменения, сделанные в правке 303, были совершенно ошибочными. Для отмены изменений нужно указать различия в обратном порядке
Реинтегрейт мерж бранча в транк. После такого мержа бранч невозможно использовать для дальнейшего получения коммитов из транка. Для пересозданию рекомендуется выполнить
svn rm http://svn.example.com/som_branch
и создать его заново
Восстановление удаленного элемента в ревизии r808. Этой командой элемент будет запланирован для добавления «с историей».
В сущности является разновидностью svn update их поведение схоже. При переключении веток (svn switch), локальные изменения сохраняются.
Удаление ветки. Если воспользоваться командами svn checkout, svn switch или svn list для обращения к ранним правкам, свою старую ветку вы увидите.
Восстановление информации в Subversion простым копированием.
Статус по файлам при тестовом мержинге.
Посмотрим когда создали нашу ветку через копирование
svn log --verbose --stop-on-copy http://svn.example.com/repos/calc/branches/my-calc-branch
Пусть будет r341.
Обновим наш транк
cd calc/trunk
svn update
At revision 405.
Вмерживаем изменения из бранча
svn merge -r 341:405 http://svn.example.com/repos/calc/branches/my-calc-branch
svn commit -m "Merged my-calc-branch changes r341:405 into the trunk."
Прошло время и опять захотели вмержить изменения из ветки в транк
Обновляем транк
cd calc/trunk
svn update
At revision 480.
Находим в логе сообщение
svn log
"r406 user 2004-02-08 11:17:26 -0600 (Sun, 08 Feb 2004) 1 line. Merged my-calc-branch changes r341:405 into the trunk."
И делаем новый мерж
svn merge -r 406:480 http://svn.example.com/repos/calc/branches/my-calc-branch
Находимся в локальной директории, которая соответствует месту, куда хотим залить изменения
Накатываем изменения из транка
svn merge -c 1004992 http://exmaple.com/trunk
Удаляем всё ненужное ручками
Коммитим изменения с внятным текстом "merge from PATH: номера ревизий через запятую". где PATH - путь бранчу, откуда делается merge. Примеры: "merge from trunk", "merge from branches/test"
Лучше помечать изменения как "no merge", чтобы не требовать интеграции в trunk ни при каких условиях. no merge также указывается при создании новых бранчей.
Ветки идеалогически может быть двух типов:
Функциональная ветка
Заводится для разработки нового функционала. Во избежание большого расхождения с транком изменения из него периодически сливаются в ветку.
Когда функционал ветки готов, её сливают в транк, а саму ветку удаляют:
Для этого из транка делают svn merge $bb/foo --reintegrate
Разрешаем конфликты.
Удаляют если надо информацию о мерже
svn pd svn:mergeinfo . -R
Можно дёрнуть для восстановления свойства svn:mergeinfo директории след. команду
svn propset svn:mergeinfo "$(svn propget svn:mergeinfo . -r HEAD)" .
Финальный коммит
svn ci -m 'CRMAPS-xxx MAPS-xxx - название задачи'
svn rm $bb/foo -m 'Удалена ветка для CRMAPS-xxx MAPS-xxx - название задачи'
Релизная ветка
Релизная ветка создаётся при выкладывании проекта в тестинг или продакшн. При этом есть два способа исправления грядущих багов в сурсах:
Исправляем сначала в транке, затем портируем (сливаем) в релизную ветку.
Исправляем баг в транке и отправляем коммит 123. Переходим в рабочую копию релизной ветки.
svn merge $trunk -c 123 -m 'Слит коммит из trunk'
Исправляем в релизной ветке, затем бэкпортируем в транк.
Исправляем баг и отправляем коммит в релизной ветки. Переходим в рабочую копию транка.
svn merge $bb/testing -m 'Слиты изменения из testing'
.
6. Команды для работы с логом и описание статуса
svn status -v Статус по файлам
Номер клонки
1
2
3
4
5
6
7
8
Обозначение
Показывает статус файла или каталога и/или ее содержимого.
Возможные статусы файлов/каталогов item:
A item был запланирован для добавления в хранилище.
C item находится в состоянии конфликта. Изменения, полученные от сервера, при обновлении пересекаются с локальными изменениями, имеющимися в рабочей копии. Перед фиксацией изменений вам необходимо разрешить этот конфликт.
D item запланирован для удаления из хранилища.
M item содержимое было изменено.
R item запланирован для замены. Сначала объект был удален, а затем другой объект с таким же именем был добавлен, все в одной правке.
X item не версионирован, но относится к внешним зависимостям Subversion.
? item не находится под контролем версий. Убрать знаки вопроса либо svn st -q, либо установив свойство svn:ignore родительского каталога.
! item находится под контролем версий, но отсутствует в рабочей копии или поврежден. Напрмер:
элемент был удален без использования команд Subversion, или оказался поврежденным, если вы прервали создание рабочей копии или обновление. Быстрый запуск svn update заново вытащит файл или каталог из хранилища, либо svn revert file восстановит отсутствующий файл.
~ item item в хранилище является объектом одного типа, а то, что на самом деле находится в рабочей копии, является чем-то другим. Например, в хранилище Subversion может иметь файл, а вы удалили файл и создали на его месте каталог, не используя для этого команды svn delete или svn add.
I item находится под контролем версий, Subversion настроена на его игнорирование при операциях svn add, svn import и svn status. Символ появляется при использовании опции
--no-ignore для svn status — иначе файл не показывается вообще!
Показывает статус свойств файлов и каталогов.
Содержит только пробел или L, это значит, что у каталога заблокирована рабочая область .svn
Содержит только пробел или +, это означает, что элемент был запланирован для «добавления с историей».
Cодержат только пробел или S, это означает, что элемент был переключен с пути остальной рабочей копии на ветку.
Показывается рабочая правка элемента
Ревизия в которой элемент последний раз изменился
Автор ревизии, в которой элемент последний раз изменился
Команды svn log