<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki2.linuxformat.ru/index.php?action=history&amp;feed=atom&amp;title=LXF71%3ASubversion</id>
		<title>LXF71:Subversion - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki2.linuxformat.ru/index.php?action=history&amp;feed=atom&amp;title=LXF71%3ASubversion"/>
		<link rel="alternate" type="text/html" href="http://wiki2.linuxformat.ru/index.php?title=LXF71:Subversion&amp;action=history"/>
		<updated>2026-05-13T22:23:33Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.11.1</generator>

	<entry>
		<id>http://wiki2.linuxformat.ru/index.php?title=LXF71:Subversion&amp;diff=6791&amp;oldid=prev</id>
		<title>Yaleks: Новая: {{Цикл/Subversion}} == Subversion ветви, тэги и слияния == : ''чАстЬ 3 Грэхем моррисон объясняет, как управлять репози...</title>
		<link rel="alternate" type="text/html" href="http://wiki2.linuxformat.ru/index.php?title=LXF71:Subversion&amp;diff=6791&amp;oldid=prev"/>
				<updated>2009-02-04T18:58:26Z</updated>
		
		<summary type="html">&lt;p&gt;Новая: {{Цикл/Subversion}} == Subversion ветви, тэги и слияния == : ''чАстЬ 3 Грэхем моррисон объясняет, как управлять репози...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Цикл/Subversion}}&lt;br /&gt;
== Subversion ветви, тэги и слияния ==&lt;br /&gt;
: ''чАстЬ 3 Грэхем моррисон объясняет, как управлять репозитарием по мере того, как проект начинает расширяться''&lt;br /&gt;
&lt;br /&gt;
Это – финальная статья из цикла, посвященного системе&lt;br /&gt;
контроля версий Subversion. После изучения базовых вопросов настройки, администрирования сервера и работы с клиентом Subversion, вы уже можете представить себе преимущества от&lt;br /&gt;
использования данной системы в вашем проекте. Впрочем, спустя&lt;br /&gt;
некоторое время вам потребуется некоторая дополнительная информация, касающаяся в первую очередь ветвей (branches). Именно об этом&lt;br /&gt;
мы и поговорим сегодня.&lt;br /&gt;
&lt;br /&gt;
Мы будем использовать некоторые из предложенных ранее концепций, чтобы проиллюстрировать удачные решения на серверной стороне. они окажут некоторое влияние на то, как вы работаете со своим&lt;br /&gt;
репозитарием Subversion, хотя все необходимые действия будут&lt;br /&gt;
выполняться со стороны клиента. Вам также потребуется материал предыдущих лекций, поэтому можете освежить его, прежде чем переходить к данной статье.&lt;br /&gt;
&lt;br /&gt;
=== Лесоводство: повторение ===&lt;br /&gt;
Настоящие деревья (те, что растут в лесу) имеют ветви. Ветви являются отростками от главного ствола дерева. Ветви Subversion играют аналогичную роль с одним небольшим отличием: со временем одна из них&lt;br /&gt;
может сама стать стволом, что не так-то просто проделать в случае с&lt;br /&gt;
реальным деревом. Ветви Subversion укрепляют процесс разработки, а&lt;br /&gt;
не расшатывают его.&lt;br /&gt;
&lt;br /&gt;
Существует несколько причин для организации ответвлений от&lt;br /&gt;
главной линии разработки. Самой распространенной из них является&lt;br /&gt;
создание новой версии таким образом, чтобы позволить выпускать&lt;br /&gt;
критичные исправления и для предыдущей. Например, для KDE 3.4&lt;br /&gt;
вышло обновление, имеющее номер 3.4.1. оно устраняет некоторые&lt;br /&gt;
ошибки, добавляет пару переводов, но не содержит в себе новых функций. Последние припасены для ближайшего «большого» обновления.&lt;br /&gt;
&lt;br /&gt;
Использование двух различных ветвей упрощает одновременную&lt;br /&gt;
поддержку стабильной (выпускаемой) и разрабатываемой версий продукта. Исправления ошибок включаются в обе из них, тогда как новые&lt;br /&gt;
функции появляются только в разрабатываемой ветви. Впрочем, особо&lt;br /&gt;
важные изменения можно перенести назад в стабильную. Это означает,&lt;br /&gt;
что разработчики могут спокойно претворять в жизнь свои идеи, не&lt;br /&gt;
боясь испортить стабильную версию.&lt;br /&gt;
&lt;br /&gt;
=== этап 1 – Разветвляемся ===&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=Пузырение&lt;br /&gt;
|Содержание=Subversion хранит каждую ревизию в виде отдельного&lt;br /&gt;
дерева файловой системы, создавая логическую копию&lt;br /&gt;
репозитария. По большей части, она состоит из символических ссылок на предыдущую версию. Это делает&lt;br /&gt;
Subversion особенно эффективным: копируется не все, а&lt;br /&gt;
только изменения между ревизиями.&lt;br /&gt;
&lt;br /&gt;
Это напоминает жесткую ссылку в терминологии&lt;br /&gt;
Linux. Жесткая ссылка выглядит и ведет себя как обычный файл, но является лишь указателем на расположение файла на диске. По сути, имена файлов тоже являются жесткими ссылками, поскольку они не содержат&lt;br /&gt;
никаких данных – только имя и указатель.&lt;br /&gt;
&lt;br /&gt;
Управление изменениями происходит в рамках процесса, известного в технических кругах как «пузырение»&lt;br /&gt;
(bubble-up). К аждое изменение копируется в новый файл&lt;br /&gt;
– это зародыш пузыря. Р евизия представляет собой полное дерево файловой системы, состоящее из копий&lt;br /&gt;
измененных файлов и символических ссылок на немодифицированные данные. Subversion создает новую ссылку&lt;br /&gt;
между отредактированным файлом и его родительским&lt;br /&gt;
каталогом. Начиная с этого момента, ссылки продвигаются вверх по дереву файловой системы до тех пор,&lt;br /&gt;
пока не достигнут ее корня. К ак только это случится, процесс считается завершенным.&lt;br /&gt;
&lt;br /&gt;
Для сравнения: в случае «ветвящегося» репозитария, CVS приходится открывать каждый файл в каталоге.&lt;br /&gt;
|Ширина=300px}}&lt;br /&gt;
[[Изображение:Img 71 95 1.png|thumb|История Subversion]]&lt;br /&gt;
Ветвь удобно представлять себе как простую копию основного репозитария кода (main trunk), сделанную в определенный момент времени.&lt;br /&gt;
Строго говоря, никто не мешает использовать вам для реализации&lt;br /&gt;
задуманного и локальную копию, но в этом нет нужды. Для Subversion,&lt;br /&gt;
ветвь – не более, чем копия, хотя исходный вариант ее истории изменений является общим с основным деревом. Это оказывает свое влияние на процесс создания ветви.&lt;br /&gt;
&lt;br /&gt;
Для иллюстрации мы по-прежнему будем использовать простое&lt;br /&gt;
приложение «Здравствуй, мир» из предыдущих выпусков. О но состоит&lt;br /&gt;
из маленького файла с исходным кодом (helloworld.cpp) и отвечающего ему файла Makefile. Сейчас они оба располагаются в одном каталоге, но по мере «ветвления» будут разнесены по разным веткам.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ svn mkdir branches&lt;br /&gt;
A branches&lt;br /&gt;
$ svn mkdir branches/stable_1_0&lt;br /&gt;
A branches/stable_1_0&lt;br /&gt;
$ svn mv helloworld.cpp branches/stable_1_0/&lt;br /&gt;
A branches/stable_1_0/helloworld.cpp&lt;br /&gt;
D helloworld.cpp&lt;br /&gt;
$ svn mv Makefile branches/stable_1_0/&lt;br /&gt;
A branches/stable_1_0/Makefile&lt;br /&gt;
D Makefile&amp;lt;/source&amp;gt;&lt;br /&gt;
Мы создали в нашей локальной рабочей копии каталог «branches»&lt;br /&gt;
и разместили в нем подкаталог «stable_1_0», в котором будет хранится&lt;br /&gt;
стабильная версия. Затем, в рамках подготовки к разветвлению кода,&lt;br /&gt;
мы переместили оба файла в директорию stable_1_0. Следующим&lt;br /&gt;
шагом будет копирование каталога, соответствующего ветви stable_1_0, в каталог, который отвечает нашей нестабильной разрабатываемой&lt;br /&gt;
ветви. О днако, прежде чем Subversion позволит нам это сделать, необходимо зафиксировать (commit) предыдущие изменения.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ svn commit -m “Created new branch structure.”&lt;br /&gt;
Deleting Makefile&lt;br /&gt;
Adding branches&lt;br /&gt;
Adding branches/stable_1_0&lt;br /&gt;
Adding branches/stable_1_0/Makefile&lt;br /&gt;
Adding branches/stable_1_0/helloworld.cpp&lt;br /&gt;
Deleting helloworld.cpp&lt;br /&gt;
Committed revision 5.&amp;lt;/source&amp;gt;&lt;br /&gt;
Флаг -m позволяет вам прокомментировать фиксируемые изменения, не запуская внешний текстовый редактор. Т еперь, когда с предыдущими ревизиями покончено, можно начать разрабатываемую ветвь,&lt;br /&gt;
сделав копию каталога stable_1_0.$ cd branches/&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ svn copy stable_1_0 HEAD&lt;br /&gt;
A HEAD&lt;br /&gt;
$ svn commit&lt;br /&gt;
Adding branches/HEAD&lt;br /&gt;
Committed revision 6.&amp;lt;/source&amp;gt;&lt;br /&gt;
В данном примере, мы использовали копию стабильной ветви&lt;br /&gt;
(stable branch) для создания разрабатываемой (development branch), в&lt;br /&gt;
которую планируется добавлять новые функции и исправления&lt;br /&gt;
найденных ошибок. Поскольку мы идем во главе процесса разработки,&lt;br /&gt;
назовем ее «HEAD».&lt;br /&gt;
&lt;br /&gt;
==== Управление доступом ====&lt;br /&gt;
Создать новую ветвь просто. Самой важной частью является последующее управление ветвями, что обычно отдается на откуп политике проекта. Т еперь, когда проект разветвился, новые разработчики могут либо&lt;br /&gt;
заняться исправлением ошибок, либо реализацией дополнительного&lt;br /&gt;
функционала в HEAD.&lt;br /&gt;
&lt;br /&gt;
Если вы заботитесь о безопасности, то можете захотеть ограничить&lt;br /&gt;
доступ к существующим ветвям и дать лишь некоторым участникам&lt;br /&gt;
проекта право на создание новых. Чтобы предоставить избранным разработчикам права на модификацию тех или иных ветвей, для доступа к&lt;br /&gt;
репозитарию необходимо использовать Apache. Причина этого состоит&lt;br /&gt;
в следующем: наиболее простым способом разграничения доступа по&lt;br /&gt;
пользователям является установка модуля Apache под названием&lt;br /&gt;
mod_authz_svn.&lt;br /&gt;
&lt;br /&gt;
Теперь из каталога HEAD можно получить новую копию разрабатываемой ветви.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ svn checkout file:///usr/share/subres/branches/HEAD&lt;br /&gt;
A HEAD/helloworld.cpp&lt;br /&gt;
A HEAD/Makefile&lt;br /&gt;
Checked out revision 6.&amp;lt;/source&amp;gt;&lt;br /&gt;
История изменений для каталога HEAD будет распространяться&lt;br /&gt;
назад лишь до точки ветвления. О днако, внутри каждой ветви, история&lt;br /&gt;
изменения индивидуальных файлов будет перенесена из их прежнего&lt;br /&gt;
местоположения. О тличие состоит в том, что helloworld.cpp сейчас скопирован в два каталога (содержится в двух ветвях). История изменения&lt;br /&gt;
файла helloworld.cpp также будет разветвлена, чтобы хранить сведения&lt;br /&gt;
для каждого файла по отдельности. В этом легко убедиться, просмотрев журнал команд. Ниже представлена урезанная версия вывода svn&lt;br /&gt;
log helloworld.cpp для ветви HEAD:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;r7 | Added a cutting-edge feature.&lt;br /&gt;
r6 | Added HEAD development branch.&lt;br /&gt;
r5 | Moved project into a branch structure&lt;br /&gt;
r4 | Resolved conflict by incorporating both changes.&amp;lt;/source&amp;gt;&lt;br /&gt;
Как видите helloworld.cpp наследует историю со времени, предшествующего созданию ветви в момент r6. В зависимости от организации&lt;br /&gt;
проекта, процесс добавления новых функций в HEAD может потребовать переноса некоторых исправлений ошибок и тому подобных вещей&lt;br /&gt;
назад, в стабильную ветвь. Чтобы сделать это, нам придется слить&lt;br /&gt;
(merge) изменения со стабильной ветвью.&lt;br /&gt;
&lt;br /&gt;
=== этАп 2 – сЛивАем одну ветвЬ с друГой ===&lt;br /&gt;
[[Изображение:Img 71 96 1.png|thumb|Код в дереве разработки наследуется каждой последовательной версией&amp;lt;br /&amp;gt;[1] оригинальная версия (1.0).&amp;lt;br /&amp;gt;[2] исправления для оригинальной версии (1.1).&amp;lt;br /&amp;gt;[3] Функции, запланированные для следующей версии (2.0).]]&lt;br /&gt;
работа над тестовой ветвью часто подразумевает решение проблем,&lt;br /&gt;
которые имеют отношение и к стабильной ветви, особенно если речь&lt;br /&gt;
идет о безопасности. В нашем примере с helloworld.cpp в разрабатываемую ветвь была добавлена еще одна строка, выводящая надпись «a&lt;br /&gt;
cutting-edge feature». конечно, в реальном случае изменения будут куда&lt;br /&gt;
более серьезными, но обсуждаемые принципы останутся&lt;br /&gt;
неизменными.&lt;br /&gt;
&lt;br /&gt;
Несмотря на общее происхождение, Subversion рассматривает эти&lt;br /&gt;
два файла как полностью различные. В прошлый раз мы использовали команду svn diff для поиска различий между двумя ревизиями&lt;br /&gt;
одного и того же файла. На сей раз перед нами стоит несколько другая задача: надо найти отличие между одним и тем же файлом, но&lt;br /&gt;
принадлежащим двум разным ветвям. Для этого нам потребуется&lt;br /&gt;
команда svn merge. Перво-наперво, необходимо сравнить изменения,&lt;br /&gt;
произведенные в стабильной и разрабатываемой ветвях.&lt;br /&gt;
&lt;br /&gt;
Просматривая журнал для helloworld.cpp из стабильной ветви, становится очевидно, что здесь нет изменений, относящихся к разрабатываемой ветви:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;r5 | Moved project into a branch structure&lt;br /&gt;
r4 | Resolved conflict by incorporating both changes.&amp;lt;/source&amp;gt;&lt;br /&gt;
ревизии r6 и r7 ветки HEAD отсутствуют. как было видно из предыдущих листингов, r6 – это процесс копирования файлов в новую ветвь,&lt;br /&gt;
а r7 – добавление новой, очень интересной функции (r7 | added a&lt;br /&gt;
cutting-edge feature).&lt;br /&gt;
разность между этими двумя ревизиями может быть определена с&lt;br /&gt;
помощью svn diff:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;diff&amp;quot;&amp;gt;$ svn diff -r 6:7 file:///usr/share/subres/branches/&lt;br /&gt;
Index: HEAD/helloworld.cpp&lt;br /&gt;
=================&lt;br /&gt;
--- HEAD/helloworld.cpp (revision 6)&lt;br /&gt;
+++ HEAD/helloworld.cpp (revision 7)&lt;br /&gt;
@@ -6,6 +6,7 @@&lt;br /&gt;
{&lt;br /&gt;
cout &amp;lt;&amp;lt; “Hello World!” &amp;lt;&amp;lt; endl;&lt;br /&gt;
cout &amp;lt;&amp;lt; “Both modified additions.” &amp;lt;&amp;lt; endl;&lt;br /&gt;
+ cout &amp;lt;&amp;lt; “Cutting edge feature.” &amp;lt;&amp;lt;endl;&lt;br /&gt;
return(0);&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Единственное добавление – это «суперновая функция» («cutting&lt;br /&gt;
edge feature»), отмеченная в листинге знаком «+», расположенным в&lt;br /&gt;
начале строки. как мы видели в прошлом месяце, вывод svn diff можно&lt;br /&gt;
использовать для создания патча. В случае с Subversion в этом нет&lt;br /&gt;
необходимости, поскольку для применения всех необходимых изменений к вашей рабочей копии можно использовать команду svn merge.&lt;br /&gt;
Начните с локальной копии файла helloworld.cpp и добавьте в него&lt;br /&gt;
изменения, отвечающие нужным ревизиям:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ svn merge -r 6:7 file:///usr/share/subres/branches/HEAD/helloworld.cpp&lt;br /&gt;
U helloworld.cpp&lt;br /&gt;
$ svn status&lt;br /&gt;
M helloworld.cpp&amp;lt;/source&amp;gt;&lt;br /&gt;
Согласно нашему коду, изменения, сделанные в ветви HEAD, были&lt;br /&gt;
перенесены в локальную копию того же файла, отмеченного буквой M&lt;br /&gt;
в первой колонке вывода команды svn merge. теперь можно просмотреть эти изменения и зафиксировать их в стабильной ветви. Между&lt;br /&gt;
слитой и оригинальной версиями может возникнуть конфликт, поэтому&lt;br /&gt;
будьте внимательны, объединяя изменения между двумя ветвями.&lt;br /&gt;
&lt;br /&gt;
==== перемотка ====&lt;br /&gt;
Использование номеров ревизий в качестве идентификаторов применяемых к вашему коду изменений может иметь нестандартные побочные эффекты. Например, их можно не указывать при переходе от&lt;br /&gt;
одной ревизии к другой. Их также можно переворачивать. Написав&lt;br /&gt;
«7:6» вместо «6:7», вы осуществите откат изменений седьмой ревизии&lt;br /&gt;
до уровня шестой. В духе предыдущего примера, можно написать:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;svn merge -r 7:6 file:///usr/share/subres/branches/HEAD/helloworld.cpp&lt;br /&gt;
G helloworld.cpp&amp;lt;/source&amp;gt;&lt;br /&gt;
буква «G» обозначает, что Subversion удачно применил изменения,&lt;br /&gt;
хранящиеся в репозитарии, к локальному файлу. Здесь уместно упомянуть команду svn revert, представляющую собой куда более безопасный&lt;br /&gt;
метод для отката локально сделанных изменений и восстановления&lt;br /&gt;
нужной версии из репозитария.&lt;br /&gt;
&lt;br /&gt;
Другим удобным трюком является смена ветви, которая соотвествует вашей локальной копии на сервере. Это достигается командой svn&lt;br /&gt;
switch. На самом деле, она не делает ничего экстраординарного –&lt;br /&gt;
просто подменяет URL, на который ссылается рабочая копия. текущий&lt;br /&gt;
URL можно просмотреть с помощью команды svn info:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ svn info&lt;br /&gt;
URL: file:///usr/share/subres/branches/stable_1_0&amp;lt;/source&amp;gt;&lt;br /&gt;
В нашем примере можно изменить ветвь со stable_1_0 на HEAD,&lt;br /&gt;
введя команду:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ svn switch file:///usr/share/subres/branches/HEAD&lt;br /&gt;
U helloworld.cpp&lt;br /&gt;
Updated to revision 7.&lt;br /&gt;
$ svn info&lt;br /&gt;
URL: file:///usr/share/subres/branches/HEAD&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== чАстЬ 3 – КЛеймЛение ===&lt;br /&gt;
Ветви сторонних поставщиков (vendor banches) позволяют включать в&lt;br /&gt;
ваш проект разработки других людей, например, внешние библиотеки.&lt;br /&gt;
С помощью ветвей поставщиков можно следить за изменениями в других проектах и, более того, быть уверенным, что все ваши разработчики&lt;br /&gt;
используют одну и ту же версию. CVS имеет специальную поддержку&lt;br /&gt;
для ветвей сторонних поставщиков, однако, Subversion достаточно универсален, чтобы интегрировать их без особых трудов.&lt;br /&gt;
&lt;br /&gt;
Ветвь стороннего поставщика обычно существует в своей структуре каталогов под общим корнем репозитария Subversion. Ее часто размещают в директории с названием «vendor» - отсюда и название&lt;br /&gt;
«vendor branch». В этот каталог необходимо импортировать весь сторонний проект целиком. когда выходит новая версия данного продукта, необходимо применять все изменения к текущей рабочей версии,&lt;br /&gt;
чтобы ваши собственные правки не потерялись. После этого можно&lt;br /&gt;
зафиксировать изменения в репозитории с тем, чтобы другие разработчики получили возможность использовать более новую версию&lt;br /&gt;
стороннего приложения.&lt;br /&gt;
&lt;br /&gt;
==== игры с тегами ====&lt;br /&gt;
{{Врезка&lt;br /&gt;
|Заголовок=нАш совет&lt;br /&gt;
|Содержание=&lt;br /&gt;
; структурируйте репозитарий&lt;br /&gt;
&lt;br /&gt;
Структура файловой системы&lt;br /&gt;
лежит целиком на плечах главы&lt;br /&gt;
проекта, но при ее создании полезно иметь в виду следующие вещи.&lt;br /&gt;
&lt;br /&gt;
Если в одном репозитарии разрабатываются разные приложения,&lt;br /&gt;
разумно завести для них отдельные каталоге верхнего уровня.&lt;br /&gt;
Подумайте, как будет происходить&lt;br /&gt;
управление ветвями и тегами.&lt;br /&gt;
большинство проектов используют&lt;br /&gt;
каталог «trunk» в качестве основного дерева разработки, а затем&lt;br /&gt;
создает теги и ветви на одном&lt;br /&gt;
уровне с ним. Это, конечно, не&lt;br /&gt;
единственный способ – все зависит&lt;br /&gt;
только от вас.&lt;br /&gt;
|Ширина=200px}}&lt;br /&gt;
Для эффективного использования ветви стороннего поставщика необходимо быть уверенным, что она не может быть изменена. В терминах&lt;br /&gt;
системы контроля версий это известно как «теггинг» (tagging), а с точки зрения Subversion, это просто ветвь, которую нельзя редактировать.&lt;br /&gt;
как и ветвь, тег (tag) – это копия репозитария, сделанная в некоторый&lt;br /&gt;
момент времени. тег похож на установку точки ревизии, более того, так&lt;br /&gt;
оно и есть, однако, на него возлагаются некоторые дополнительные&lt;br /&gt;
функции. тег - хороший способ отметить прохождение контрольной&lt;br /&gt;
точки в цикле разработки.&lt;br /&gt;
&lt;br /&gt;
одной из главных причин для создания тега является выпуск важной версии, например, stable_1_0 в нашем примере. как и ветви, теги&lt;br /&gt;
– не более чем копии репозитария, и для их создания можно использовать команду svn copy. Единственным отличием является необходимость явно указать создание тега в комментарии к ревизии и запрет на&lt;br /&gt;
редактирование помеченных ветвей со стороны других разработчиков.&lt;br /&gt;
&lt;br /&gt;
Чтобы сделать тег в нашем предыдущем примере, выполните&lt;br /&gt;
следующие команды:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ svn mkdir file:///usr/share/subres/tags&lt;br /&gt;
Committed revision 8.&lt;br /&gt;
$ svn copy file:///usr/share/subres/branches/stable_1_0 file:///usr/share/subres/tags/release_1&lt;br /&gt;
Committed revision 9.&amp;lt;/source&amp;gt;&lt;br /&gt;
такой подход обладает очевидным недостатком: ничто не мешает разработчику взять и изменить содержимое данной директории. В большинстве случаев это не проблема, так как «неприкосновенность» тегов регулируется политикой проекта. однако, в случае необходимости вы можете&lt;br /&gt;
«затянуть гайки».&lt;br /&gt;
&lt;br /&gt;
Это потребует от нас перейти к первом руководству из данной серии,&lt;br /&gt;
поскольку для решения данной проблемы используются ловушки (hooks)&lt;br /&gt;
системы Subversion. Напомним, что ловушка – это сценарий, который&lt;br /&gt;
выполняется в качестве реакции на некоторое событие. С их помощью&lt;br /&gt;
можно легко отменить изменения, случайно сделанные в отмеченной тегом&lt;br /&gt;
ветви. кроме этого, можно использовать уже упоминавшийся ранее модуль&lt;br /&gt;
mod_authz_svn.&lt;br /&gt;
&lt;br /&gt;
И вот оно, долгожданное окончание! C’est tout. Je suis un sandwich! я&lt;br /&gt;
надеюсь, что этого краткого введения хватит не только для поддержания своего собственного сервера, но и для полноценного участия в других проектах. Если этот проект будет успешным, вам непременно придется объединять изменения и выполнять прочие описанные здесь&lt;br /&gt;
операции, двигая вперед весь цикл разработки.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|center|&lt;br /&gt;
|Заголовок=удАЛенный доступ К проеКту с помоЩЬю SVNSERVE&lt;br /&gt;
|Содержание=&lt;br /&gt;
[[Изображение:Img 71 97 1.jpg|thumb|после запуска svnserve с сервером можно будет работать из Konqueror.]]&lt;br /&gt;
В первом руководстве данной серии было показано, как использовать модуль Apache для обеспечения удаленного доступа. Но мы также можем&lt;br /&gt;
использовать для этих целей протокол svn://.&lt;br /&gt;
Серверное приложение, ответственное за предоставление такой возможности, называется svnserve&lt;br /&gt;
и является частью стандартной установки&lt;br /&gt;
Subversion. По умолчанию оно не используется,&lt;br /&gt;
поскольку предназначается преимущественно для&lt;br /&gt;
решения небольших, нетребовательных задач, но в&lt;br /&gt;
этом случае может оказаться стоящей альтернативой Apache.&lt;br /&gt;
&lt;br /&gt;
Запустить сервер очень просто. Введите команду с парой параметров (режимом работы и путем к&lt;br /&gt;
репозитарию):&lt;br /&gt;
 svnserve -d -r path_to_repository&lt;br /&gt;
Это запустит сервер в режиме демона (альтернативой является использование Internet Daemon,&lt;br /&gt;
известного также как inetd). Путь к репозиторию указывается опцией -r. После запуска сервера вы можете сразу же получить к нему доступ по протоколу&lt;br /&gt;
svn:&lt;br /&gt;
 svn co svn://localhost&lt;br /&gt;
По умолчанию, svnserve предоставляет анонимный доступ в режиме «read-only». Это поведение&lt;br /&gt;
можно изменить, отредактировав файл svnserve.&lt;br /&gt;
conf, расположенный в конфигурационном каталоге&lt;br /&gt;
репозитария. Этот файл хорошо документирован.&lt;br /&gt;
&lt;br /&gt;
разрешение и запрет анонимного доступа&lt;br /&gt;
производится в секции [general.&lt;br /&gt;
&lt;br /&gt;
Чтобы контролировать доступ на уровне&lt;br /&gt;
отдельных пользователей, включите эту возможность в поле Auth-access, укажите в&lt;br /&gt;
password-db путь к файлу с паролями и&lt;br /&gt;
создайте этот файл. Например:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ini&amp;quot;&amp;gt;svnserve.conf:&lt;br /&gt;
[general]&lt;br /&gt;
anon-access = none&lt;br /&gt;
auth-access = write&lt;br /&gt;
password-db = passwd&lt;br /&gt;
passwd:&lt;br /&gt;
[users]&lt;br /&gt;
graham = grahampassword&amp;lt;/source&amp;gt;&lt;br /&gt;
После этого при доступе к репозиторию нужно будет указывать имя пользователя, добавляя&lt;br /&gt;
его к адресу сервера, и вводить пароль.&lt;br /&gt;
 svn co svn://graham@localhost&lt;br /&gt;
Недостаток описанного выше метода состоит в&lt;br /&gt;
том, что пароли отправляются открытым текстом.&lt;br /&gt;
Это представляет собой угрозу безопасности. Для&lt;br /&gt;
устранения данной проблемы следует использовать&lt;br /&gt;
вездесущий SSH, чтобы защитить соединение между клиентом и сервером. Все, что вам потребуется –&lt;br /&gt;
это установить SSH и создать учетную запись на&lt;br /&gt;
сервере. Sunserve запускается при подключении&lt;br /&gt;
пользователя, так что его не обязательно постоянно&lt;br /&gt;
держать в памяти. однако, клиенту необходимо явно&lt;br /&gt;
указать путь к репозитарию на файловой системе&lt;br /&gt;
сервера. Например:&lt;br /&gt;
 svn co svn+ssh://graham@localhost/usr/share/subres&lt;br /&gt;
|Ширина=}}&lt;/div&gt;</summary>
		<author><name>Yaleks</name></author>	</entry>

	</feed>