SVN
Subversion пример использования
Перевод статьи приведенной в официальной вики FreeBSD
Примечание: помимо этой статьи, вы должны прочитать http://people.freebsd.org/~piter/svn_notes.txt, так как этот документ, очень плохо, передает тонкости.
Примечание: "subversion book" представляет собой прекрасный образец. Смотрите первые несколько глав http://svnbook.red-bean.com/. На момент написания, актуальна версия Subversion 1.5.
Содержание
Обзор
Репозиторий src, системы и ядра FreeBSD, переведен с CVS, на Subversion, 3 июня 2008.
- Commits are atomic
- Revision numbers apply across the repository - all files that were modified in the same commit have the same revision number
- Branching and tagging are namespace operations
- Directories are versioned
- Files and directories can have arbitrary, versioned metadata (properties) attached to them
- Files and directories can be copied, with full history tracking
- No more contortions due to cvs weaknesses, such as applying patch(1) files at compile time in order to avoiding touching of vendor branch code.
- No more repo-copies.
Установка клиента
Установить порт devel/subversion-freebsd:
% cd /usr/ports/devel/subversion-freebsd % sudo make install clean
"Свеже установленный" devel/subversion не знает, как раскрыть $FreeBSD$ теги.
Getting started
Существует три пути, получения рабочей копии, репозитория Subversion.
Метод прямого создания рабочей копии
$ svn checkout svn+ssh://svn.freebsd.org/base/head /usr/src
Host svn.freebsd.org User jarjar
Локальная копия для официального зеркала
Создание локального зеркала, используя SVK
$ svk mirror svn+ssh://svn.freebsd.org/base //freebsd/base
$ svk sync //freebsd/base
$ cd ~ $ scp freefall:/home/peter/dot_svk_r179646.tbz2 . $ tar xf dot_svk_r179646.tbz2
$ svk checkout //freebsd/base/head /usr/src
$ svk mkdir //local/freebsd $ svk copy //freebsd/base/head //local/freebsd/head
$ svk pull //local/freebsd/head
$ svk checkout //local/freebsd/head /usr/src
$ cd /usr/src $ svk smerge -f sys/dev/bge
RELENG_* бранчи и общая схема
Given svn+ssh://svn.freebsd.org/base, base refers to the src tree. There will presumably be others. Expect things like /ports, /scratch, /proj, etc. These are separate repositories with their own change number sequences, access controls and commit mail.
Для основного "base" репозетория, определена ссылка /head в -current(тукущем) дереве. Например /head/bin/ls, в релизе преобразуется, в /usr/src/bin/ls.
Остальные ссылки помимо */head:
- /stable/<n> соответствует RELENG_<n>.
- /releng/<n.n> соответствует RELENG_<n_n>
- /release/<n.n.n> соответствует RELENG_<n_n_n>_RELEASE
- /vendor* vendor branch import work area
- /projects and /user feature branch work area, like we have in perforce.
где <n> это цифра соответствующая, версии или конкретной подверсии.
Ежедневное использование
Help
$ svn help $ svn help checkout
Checkout
$ svn checkout svn+ssh://svn.freebsd.org/base/head /usr/src
$ svn checkout --depth=immediates svn+ssh://svn.freebsd.org/base
$ svn up --set-depth=infinity base/head $ svn up --set-depth=immediates base/release base/releng base/stable
$ svn up --set-depth=infinity base/stable/7
$ svn up --set-depth=infinity base/stable/7/sys $ svn up --set-depth=infinity base/stable/7
Update
$ svn update $ svn update -r12345
Status
$ svn status
$ svn status --show-updates
Edit и commit
$ svn commit
$ svn commit lib/libfetch usr.bin/fetch
Add и remove
$ touch foo $ svn add foo
$ svn remove foo
$ mkdir bar $ svn add bar
$ svn mkdir bar
$ svn rm bar
Copy и move
Создание копии файла с именем foo.c, назвав её bar.c:
$ svn copy foo.c bar.c
Этой операции нет эквивалента в CVS.
Перемещение или переименование файла, тоже поддерживается:
$ svn move foo.c bar.c
Это на самом деле точный эквивалент, следующего набора операций
$ svn copy foo.c bar.c $ svn remove foo.c
Log и annotate
Diff
$ svn diff -r179453:179454 ROADMAP.txt
$ svn diff -c179454 .
Revert
Конфликты
$ svn resolved foo
$ svn resolve --accept=working foo
This is equivalent to the previous example. Possible values for --accept are:
- working: use the version in your working directory (which one presumes has been edited to resolve the conflicts)
- base: use a pristine copy of the version you had before svn update, discarding your own changes, the conflicting changes, and possibly other intervening changes as well.
- mine-full: use what you had before svn update, including your own changes, but discarding the conflicting changes, and possibly other intervening hanges as well.
- theirs-full: use the version that was retrieved when you did svn update, discarding your own changes.
Продвинутое использование
Sparse checkouts
$ svn checkout -N svn+ssh://svn.freebsd.org/base ~/freebsd
$ svn checkout --depth=empty svn+ssh://svn.freebsd.org/base ~/freebsd
Valid arguments to --depth are:
- empty: the directory itself without any of its contents
- files: the directory and any files it contains
- immediates: the directory, any files and directories it contains, but none of the subdirectories' contents
- infinity: everything
$ cd ~/freebsd $ svn update --set-depth=immediates .
$ svn update --set-depth=infinity head
Direct operation
- log, diff
- mkdir
- remove, copy, rename
- propset, propdel, propedit
- merge
$ svn copy svn+ssh://svn.freebsd.org/base/head svn+ssh://svn.freebsd.org/base/stable/8
$ svn checkout --depth=immediates svn+ssh://svn.freebsd.org/base $ cd base $ svn update --depth=infinity head $ svn copy head stable/8 $ svn commit stable/8
Merging
Подробности смотри SubversionPrimer/Merging (Англ.)
Vendor imports
Подробности смотри SubversionPrimer/VendorImports (Англ.)
Reverting a commit
$ svn merge -r179454:179453 ROADMAP.txt $ svn commit
$ svn merge -c -179454 ROADMAP.txt $ svn commit
$ svn merge -r179454:179453 svn+ssh://svn.freebsd.org/base/ROADMAP.txt
$ svn copy svn+ssh://svn.freebsd.org/base/ROADMAP.txt@179454 . $ svn commit
$ svn copy svn+ssh://svn.freebsd.org/base/ROADMAP.txt@179454 svn+ssh://svn.freebsd.org/base
Исправление ошибок
Setting up a svnsync mirror
$ rsync -va --partial --progress freefall:/home/peter/svnmirror-base-r179637.tbz2 .
$ rsync -va --partial --progress rsync://repoman.freebsd.org:50873/svnseed/svnmirror-base-r179637.tbz2 .
$ fetch ftp://ftp.freebsd.org/pub/FreeBSD/development/subversion/svnmirror-base-r179637.tbz2
$ svnsync sync file:///home/svnmirror/base
$ svn proplist -v --revprop -r 0 file:///home/svnmirror/base
Советы
$ svn co --depth=empty svn+ssh://svn.freebsd.org/base fbsvn $ cd fbsvn $ svn up --depth=empty stable $ svn up head $ cd stable $ cp -r ../head/ 7 $ cd 7 $ svn switch svn+ssh://svn.freebsd.org/base/stable/7 $ cd .. $ cp -r 7/ 6 $ cd 6 $ svn switch svn+ssh://svn.freebsd.org/base/stable/6
% svn propdel -R svn:keywords . % svn revert -R .
Не очень хорошая идея, не интегрировать свои патчи, в систему, хотя...
Ссылки
Статья в википедии о SVN (Рус.), безотносительно системы, общие принципы. (Очень даже неплохая, и полная, даже полнее англоязычной статьи (Англ.), такого же плана)