Что означают «ветвь», «тег» и «ствол» в хранилищах Subversion? - PullRequest
1166 голосов
/ 19 августа 2008

Я часто видел эти слова в дискуссиях о Subversion (и, я думаю, в общем хранилище). Я использовал SVN для своих проектов последние несколько лет, но я никогда не понимал полную концепцию этих каталогов.

Что они означают?

Ответы [ 16 ]

892 голосов
/ 19 августа 2008

Хм, не уверен, что я согласен с тем, что Ник ре тэг похож на ветку. Тег это просто маркер

  • Магистраль будет основной частью разработки, начиная с начала проекта до настоящего времени.

  • Ветвь будет копией кода, полученного из определенной точки в стволе, который используется для применения основных изменений в коде при сохранении целостности кода в багажнике. Если основные изменения работают в соответствии с планом, они обычно объединяются обратно в магистраль.

  • Tag будет моментом времени на стволе или ветви, которые вы хотите сохранить. Две основные причины сохранения могут заключаться в том, что это либо основной выпуск программного обеспечения, будь то альфа, бета, RC или RTM, либо это наиболее стабильная точка программного обеспечения до применения основных изменений в магистрали.

В проектах с открытым исходным кодом основные ветви, которые не приняты заинтересованными сторонами проекта, могут стать основой для вилок - например, совершенно отдельные проекты, имеющие общее происхождение с другим исходным кодом.

Ветвь и поддерево тегов отличаются от ствола следующими способами:

Subversion позволяет системным администраторам создавать скрипты хуков , которые запускаются для выполнения при возникновении определенных событий; например, внесение изменений в хранилище. Типичная реализация репозитория Subversion очень часто рассматривает любой путь, содержащий «/ tag /», как защищенный от записи после создания; в результате, созданные тэги являются неизменяемыми (по крайней мере, для «обычных» пользователей). Это делается с помощью сценариев ловушек, которые обеспечивают неизменность, предотвращая дальнейшие изменения, если tag является родительским узлом измененного объекта.

В Subversion также добавлены функции, начиная с версии 1.5, относящиеся к «отслеживанию слияния веток», так что изменения, зафиксированные в ветке , могут быть объединены обратно в транк с поддержкой постепенного, «умного» объединения.

550 голосов
/ 20 сентября 2008

Прежде всего, как указывают @AndrewFinnell и @KenLiu, в SVN имена каталогов сами по себе ничего не значат - «ствол, ветви и теги» - это просто общее соглашение, которое используется большинством репозиториев. Не во всех проектах используются все каталоги (достаточно часто вообще не использовать «теги»), и на самом деле ничто не мешает вам называть их как угодно, хотя нарушение соглашения часто сбивает с толку.

Я опишу, вероятно, наиболее распространенный сценарий использования ветвей и тегов и приведу пример сценария их использования.

  • Магистраль : основная зона разработки. Это место, где живет ваш следующий основной выпуск кода, и, как правило, имеет все новейшие функции.

  • Ветви : Каждый раз, когда вы выпускаете основную версию, создается ветка. Это позволяет вам исправлять ошибки и создавать новые версии, не выпуская новейшие - возможно, незавершенные или непроверенные - функции.

  • Теги : Каждый раз, когда вы выпускаете версию (финальный выпуск, релиз-кандидаты (RC) и бета-версии), вы делаете для нее тег. Это дает вам на момент времени копию кода, которая была в этом состоянии, позволяя вам вернуться и воспроизвести любые ошибки, если это необходимо в предыдущей версии, или переиздать предыдущую версию в точности так, как это было. Ветви и теги в SVN облегчены - на сервере он не создает полную копию файлов, а просто маркер, говорящий «эти файлы были скопированы с этой версией», занимающий всего несколько байтов. Имея это в виду, вы никогда не должны беспокоиться о создании тега для любого выпущенного кода. Как я уже говорил ранее, теги часто опускаются, и вместо этого в журнале изменений или другом документе номер редакции уточняется при выпуске.


Например, допустим, вы начинаете новый проект. Вы начинаете работать в «стволе», над чем в конечном итоге будет выпущена версия 1.0.

  • trunk / - версия для разработки, скоро будет 1.0
  • ветви / - пусто

Как только 1.0.0 закончен, вы ветвитесь на ствол в новую ветку "1.0" и создаете тег "1.0.0". Теперь работа над тем, что в итоге будет 1.1, продолжается в багажнике.

  • trunk / - версия для разработки, скоро будет 1.1
  • филиалы / 1.0 - 1.0.0 релизная версия
  • теги / 1.0.0 - версия 1.0.0

Вы сталкиваетесь с некоторыми ошибками в коде и исправляете их в trunk, а затем объединяете исправления с веткой 1.0. Вы также можете сделать обратное и исправить ошибки в ветке 1.0, а затем объединить их обратно в транк, но обычно проекты придерживаются одностороннего объединения только для уменьшения шансов что-то упустить. Иногда ошибка может быть исправлена ​​только в 1.0, потому что она устарела в 1.1. Это на самом деле не имеет значения: вам нужно только убедиться, что вы не выпускаете 1.1 с теми же ошибками, которые были исправлены в 1.0.

  • trunk / - версия для разработки, скоро будет 1.1
  • Branchs / 1.0 - Предстоящий релиз 1.0.1
  • теги / 1.0.0 - версия 1.0.0

Как только вы найдете достаточно ошибок (или, может быть, одну критическую ошибку), вы решаете выпустить 1.0.1. Итак, вы делаете тег «1.0.1» из ветки 1.0 и выпускаете код. На этом этапе транк будет содержать то, что будет 1.1, а ветвь "1.0" содержит код 1.0.1. В следующий раз, когда вы выпустите обновление до 1.0, это будет 1.0.2.

  • trunk / - версия для разработки, скоро будет 1.1
  • Branchs / 1.0 - Предстоящий релиз 1.0.2
  • теги / 1.0.0 - версия 1.0.0
  • тегов / 1.0.1 - версия 1.0.1

В конце концов вы почти готовы к выпуску 1.1, но сначала вы хотите сделать бета-версию. В этом случае вы, скорее всего, сделаете ветку «1.1» и тег «1.1beta1». Теперь работа над тем, что будет 1.2 (или, может быть, 2.0), продолжается в транке, но работа над 1.1 продолжается в ветви "1.1".

  • trunk / - версия для разработки, скоро будет 1.2
  • branch / 1.0 - готовится к выпуску 1.0.2
  • филиалов / 1.1 - предстоящий выпуск 1.1.0
  • теги / 1.0.0 - версия 1.0.0
  • теги / 1.0.1 - версия 1.0.1
  • теги / 1.1beta1 - версия 1.1 1.1 beta 1

Как только вы выпускаете 1.1 final, вы делаете тег "1.1" из ветви "1.1".

Вы также можете продолжать поддерживать 1.0, если хотите, портируя исправления ошибок между всеми тремя ветвями (1.0, 1.1 и trunk). Важным выводом является то, что для каждой основной версии программного обеспечения, которую вы поддерживаете, у вас есть ветвь, которая содержит последнюю версию кода для этой версии.


Другое использование веток для функций. Здесь вы ветвитесь в ствол (или одну из веток релиза) и работаете над новой функцией изолированно. Как только функция завершена, вы объединяете ее и удаляете ветку.

  • trunk / - версия для разработки, скоро будет 1.2
  • Branchs / 1.1 - предстоящая версия 1.1.0
  • branch / ui-rewrite - экспериментальная ветвь функций

Идея этого заключается в том, что вы работаете над чем-то разрушительным (что может задержать или мешать другим людям выполнять свою работу), чем-то экспериментальным (что может даже не войти), или, возможно, просто тем, что требует долгое время (и вы боитесь, что если он будет поддерживать релиз 1.2, когда вы будете готовы перейти с 1.2 на транк), вы можете сделать это изолированно в ветке. Как правило, вы поддерживаете его в актуальном состоянии с транком, постоянно объединяя в него изменения, что облегчает повторную интеграцию (слияние обратно в транк), когда вы закончите.


Также обратите внимание, что схема управления версиями, которую я здесь использовал, является лишь одной из многих. Некоторые команды могут делать исправления ошибок / выпуски поддержки как 1.1, 1.2 и т. Д., А основные изменения - как 1.x, 2.x и т. Д. Здесь используется то же самое, но вы можете назвать ветвь «1» или «1». .x "вместо" 1.0 "или" 1.0.x ". (Кроме того, семантическое управление версиями - хорошее руководство о том, как делать номера версий).

94 голосов
/ 19 августа 2008

В дополнение к тому, что сказал Ник, вы можете узнать больше на Потоковые линии: шаблоны ветвления для параллельной разработки программного обеспечения

enter image description here

На этом рисунке main - это ствол, rel1-maint - это ветвь, а 1.0 - это тег.

75 голосов
/ 22 сентября 2008

В общем случае (независимое от инструмента представление) ветвь - это механизм, используемый для параллельной разработки. SCM может иметь от 0 до n ветвей. Subversion имеет 0.

  • Магистраль является основной веткой рекомендуется от Subversion , но вы никоим образом не обязаны его создавать. Вы можете назвать его «основным» или «релизами», или не иметь его вообще!

  • Ветвь представляет собой разработку. Никогда не следует называть в честь ресурса (например, vonc_branch), но после:

    • цель 'myProject_dev' или 'myProject_Merge'
    • периметр выпуска 'myProjetc1.0_dev' или myProject2.3_Merge 'или' myProject6..2_Patch1 '...
  • Тег - это снимок файлов, чтобы легко вернуться в это состояние. Проблема в том, что тег и ветвь одинаковы в Subversion . И я определенно рекомендую параноидальный подход:

    вы можете использовать один из сценариев контроля доступа, поставляемых с Subversion, чтобы запретить кому-либо делать что-либо, кроме создания новых копий в области тегов.

Тег окончательный. Его содержание никогда не должно меняться. НИКОГДА. Когда-либо. Вы забыли строку в примечании к выпуску? Создать новый тег. Устаревший или удалить старый.

Теперь я много читал о «объединении таких-то и таких-то в таких-то и таких-то ветвях, а затем, наконец, в стволовой ветке». Это называется рабочий процесс слияния и здесь ничего обязательного нет . Не потому, что у вас есть магистральная ветвь, вы должны объединить обратно что угодно.

По соглашению, ветвь ствола может представлять текущее состояние вашей разработки, но это для простого последовательного проекта, то есть проекта, который имеет:

  • нет «заблаговременной» разработки (для подготовки следующей-следующей версии подразумеваются такие изменения, что они несовместимы с текущей «магистральной» разработкой)
  • без масштабного рефакторинга (для тестирования нового технического выбора)
  • нет долгосрочного обслуживания предыдущего выпуска

Поскольку с одним (или всеми) из этого сценария вы получаете четыре «ствола», четыре «текущих разработки», и не все, что вы делаете в этой параллельной разработке, обязательно должны быть объединены обратно в «ствол».

37 голосов
/ 19 августа 2008

В SVN тег и ветка действительно похожи.

Метка = определенный временной интервал, обычно используемый для релизов

Ветвь = также определенный отрезок времени, на котором может продолжаться разработка, обычно используемая для основной версии, такой как 1.0, 1.5, 2.0 и т. Д., Затем, когда вы отпускаете, вы отмечаете ветку. Это позволяет вам продолжать поддерживать производственную версию, в то же время продвигаясь вперед с серьезными изменениями в стволе

Магистраль = рабочее пространство разработки, именно здесь должна происходить вся разработка, а затем изменения объединяются с выпусками ветвления.

29 голосов
/ 19 августа 2008

Они на самом деле не имеют никакого формального значения. Папка есть папка в SVN. Это общепринятый способ организации вашего проекта.

  • Ствол - это то место, где вы храните свою основную линию развития. Папка веток - это место, где вы можете создавать ветки, которые трудно объяснить в коротком посте.

  • Ветвь - это копия подмножества вашего проекта, над которой вы работаете отдельно от ствола. Может быть, это для экспериментов, которые могут никуда не пойти, или, может быть, для следующего выпуска, который вы позже объедините обратно в ствол, когда он станет стабильным.

  • А папка tags предназначена для создания помеченных копий вашего хранилища, обычно на контрольных точках выпуска.

Но, как я уже сказал, для SVN папка - это папка. branch, trunk и тег - это просто соглашение.

Я свободно использую слово «копировать». На самом деле SVN не делает полные копии вещей в хранилище.

13 голосов
/ 19 августа 2008

trunk - это линия разработки, которая содержит новейший исходный код и функции. Он должен содержать последние исправления ошибок, а также последние функции, добавленные в проект.

Ветви обычно используются для выполнения чего-либо вне ствола (или другой линии разработки), которое иначе нарушило бы сборку. Новые функции часто встроены в ветку, а затем объединены обратно в ствол. Ветви часто содержат код, который не обязательно одобрен для той ветки разработки, из которой он ветвился. Например, программист может попробовать оптимизировать что-то в ветке и слиться обратно в линию разработки, только если оптимизация удовлетворительная.

Теги являются снимками репозитория в определенный момент времени. Никакого развития не должно происходить на них. Чаще всего они используются для получения копии того, что было передано клиенту, чтобы вы могли легко иметь доступ к тому, что использует клиент.

Вот ссылка на очень хорошее руководство по репозиториям:

Статьи в Википедии также стоит прочитать.

11 голосов
/ 30 июня 2009

Теперь дело в разработке программного обеспечения: нет никаких последовательных знаний о чем-либо, у всех, кажется, все по-своему, но это потому, что в любом случае это относительно молодая дисциплина.

Вот мой простой способ,

Магистраль - Директория транка содержит самую последнюю, утвержденную и объединенную совокупность работ. Вопреки тому, что многие признались, мой багажник предназначен только для чистой, аккуратной, одобренной работы, и не для разработки, а для освобождения.

В определенный момент времени, когда кажется, что ствол полностью готов к освобождению, он помечается и освобождается.

ветки - Каталог веток содержит эксперименты и текущую работу. Работа под веткой остается там до тех пор, пока не будет одобрен для слияния в ствол. Для меня это та область, где вся работа выполнена.

Например: у меня может быть ветвь iteration-5 для пятого раунда разработки продукта, возможно ветвь prototype-9 для девятого раунда эксперимента, и и так далее.

tags - Каталог тегов содержит снимки утвержденных веток и выпусков стволов. Всякий раз, когда ветвь одобрена для слияния со стволом или выпускается ствол, снимок утвержденного ветвления или выпуска ствола делается под тегами.

Полагаю, с помощью тегов я могу прыгать назад и вперед во времени к интересующим точкам.

10 голосов
/ 26 июля 2011

Я нашел это замечательное руководство по SVN, когда искал веб-сайт автора OpenCV 2 поваренной книги по программированию приложений Computer Vision, и я решил поделиться.

У него есть учебник о том, как использовать SVN и что означают фразы «ствол», «тег» и «ветвь».

Цитируется непосредственно из его урока:

Текущая версия вашего программного проекта, над которой в настоящее время работает ваша команда, обычно находится в каталоге под названием trunk . По мере развития проекта разработчик обновляет эту версию, исправляет ошибки, добавляет новые функции) и отправляет свои изменения в этот каталог.

В любой момент времени вы можете захотеть заморозить версию и сделать снимок программного обеспечения в том виде, в каком оно находится на данном этапе разработки. Как правило, это соответствует официальным версиям вашего программного обеспечения, например, версиям, которые вы поставите своим клиентам. Эти снимки находятся в каталоге tags вашего проекта.

Наконец, часто бывает полезно создать в какой-то момент новую линию разработки для вашего программного обеспечения. Это происходит, например, когда вы хотите протестировать альтернативную реализацию, в которой вам нужно изменить свое программное обеспечение, но вы не хотите отправлять эти изменения в основной проект, пока не решите, принимаете ли вы новое решение. Затем основная команда может продолжить работу над проектом, в то время как другие разработчики работают над прототипом. Вы бы поместили эти новые линии развития проекта в каталог под названием branch .

9 голосов
/ 17 ноября 2010

Одна из причин, почему у каждого есть немного другое определение, заключается в том, что Subversion реализует ноль поддержку ветвей и тегов. Subversion в основном говорит: Мы рассмотрели полнофункциональные ветви и теги в других системах и не нашли их полезными, поэтому мы ничего не реализовали. Просто сделайте копию в новый каталог с именем Convention вместо . Тогда, конечно, каждый волен иметь немного разные соглашения. Чтобы понять разницу между тегом real и простым соглашением копирования + именования см. статью в Википедии Теги и ветви Subversion .

...