SVN

Материал из wiki.lissyara.su
Перейти к: навигация, поиск

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 (Рус.), безотносительно системы, общие принципы. (Очень даже неплохая, и полная, даже полнее англоязычной статьи (Англ.), такого же плана)