Не могу сказать, что я большой фанат Subversion. По-моему, Git прекрасен, и никакие другие системы контроля версий не нужны. Тем не менее, работать с Subversion время от времени приходится, потому что нужно сделать checkout какого-то древнего полумертвого проекта или еще почему-то. Так что, в этой заметке мы рассмотрим основы работы с Subversion, ну и заодно почему он иногда может быть даже интереснее, чем Git. Заметка рассчитана на тех, кто уже имеет опыт использования Git или хотя бы Mercurial.

Перекрестная ссылка: Вас также может заинтересовать старенькая заметка Мой первый опыт работы с Subversion . Там речь идет больше про настройку серверной стороны, а также про использование всяких TortoiseSVN и прочих GUI. Данный же пост посвящен работе с уже существующими репозиториями из консоли.

Итак, почему же Subversion иногда может быть интереснее, чем Git:

  • Считается, что централизованную систему контроля версий проще объяснить новичкам;
  • Используются последовательные номера ревизий, ясно что за чем шло;
  • Тут можно чекаутить отдельные каталоги и делать для них свои бранчи;
  • Есть поддержка file lock, что иногда, пожалуй, может быть удобно;
  • Subversion лучше работает с бинарными файлами и компактно хранит их дифы;

Я, впрочем, не гугу Subversion. Но в первом приближении, вроде, все верно.

Теперь перейдем к командам.

Делаем checkout:

svn co —username eax https: // example.com / project / trunk /

Подсасываем последние изменения:

svn up

Проверить, в какой ветке мы находимся и на какой сервер смотрим:

svn info

Посмотреть историю изменений:

svn up
svn log | less

История изменений с diff’ами, аналог git log -p :

svn log —diff | less

Кто какие строчки когда менял:

svn blame -v test.txt

Посмотреть незакомиченные изменения:

svn diff

Какие файлы были изменены или добавлены:

svn diff —summarize

Изменения в рамках ревизиции, аналог git show :

# посмотреть комментарий
svn log -c 123456
# посмотреть изменения
svn diff -c 123456

Посмотреть измененные в ревизии файлы:

svn diff —summarize -c 123456

Изменения по сравнению с текущей ревизией, аналог git diff :

svn diff -r 123456
svn diff —summarize -r 123456

Применение сохраненного в файл дифа, аналог git apply :

patch -p0 -i myfile.diff

Отменить последние изменения, аналог git reset --hard HEAD :

svn revert —recursive .

Текущее состояние репозитория, измененные файлы и так далее:

svn status

Удалить неотслеживаемые файлы и каталоги — встроенной команды, увы, нет, но можно прописать алиас в .bashrc:

svn status | perl -lne ‘if(/^?s+(.*?)$/){ print $1 }’ | xargs rm -r

Получение списка бранчей:

svn ls https: // example.com / project / branches /

Создание нового бранча или тэга:

svn copy https: // example.com / project / trunk /
https: // example.com / project / branches / test-branch

svn copy https: // example.com / project / trunk /
https: // example.com / project / tags / 1.0
-m «Release 1.0»

Переключение на бранч:

cd path / to / trunk
cd ..
mkdir branches
cd branches
svn co https: // example.com / project / branches / test-branch
cd test-branch

Мерж бранча:

svn merge http: // example.ru / project / branches / test-branch

Удаление бранча:

svn delete http: // example.ru / project / branches / test-branch
-m «Removing test-branch»

Примечание: Примите также во внимание, что если вы сделали checkout самого корня репозитория, в котором находятся каталоги trunk, branches и tags, то можете просматривать бранчи обычным ls , удалять обычным svn rm с последующим коммитом, и так далее. Впрочем, в больших проектах вы вряд ли захотите делать checkout вот прямо всего репозитория целиком.

Добавить файл:

svn add text.txt

Переименовать файл:

svn mv from.txt to.txt

Удалить файл:

svn del file.txt

Lock/unlock, чтобы файл никто не мог менять кроме нас:

svn lock file.txt
svn unlock file.txt

Коммит и сразу пуш, потому что это SVN:

svn commit -m ‘Your comment here’

В общем-то, описанных команд вам хватит в 95% всех случаев. Дополнительную информацию рекомендую искать в man’ах и help’ах. Еще можно порекомандовать книгу Pragmatic Version Control using Subversion .

А пользуетесь ли вы Subversion и если да, то какие команды советовали бы добавить к приведенному выше списку?

Дополнение: Практика работы с системами контроля версий

EnglishRussianUkrainian