Что означают «ветвь», «тег» и «магистраль» в репозиториях Subversion?

StackOverflow https://stackoverflow.com/questions/16142

Вопрос

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

Что они имеют в виду?

Это было полезно?

Решение

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

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

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

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

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

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

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

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

Другие советы

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

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

  • Ствол:Основное направление развития.Здесь находится ваша следующая основная версия кода, и она, как правило, содержит все новейшие функции.

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

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


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

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

После завершения версии 1.0.0 вы разветвляете магистраль на новую ветку «1.0» и создаете тег «1.0.0».Сейчас работа над тем, что в конечном итоге будет 1.1, продолжается в багажнике.

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

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

  • багажник/ - версия для разработки, скоро будет 1.1
  • ветки/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.

  • багажник/ - версия для разработки, скоро будет 1.1
  • ветки/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».

  • багажник/ - версия для разработки, скоро будет 1,2
  • ветки/1.0 — предстоящий выпуск 1.0.2
  • ветки/1.1 — предстоящий выпуск 1.1.0
  • теги/1.0.0 – версия выпуска 1.0.0
  • теги/1.0.1 - версия выпуска 1.0.1
  • tags/1.1beta1 - версия выпуска 1.1 beta 1

Как только вы выпустите финальную версию 1.1, вы создадите тег «1.1» из ветки «1.1».

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


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

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

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


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

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

enter image description here

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • В багажнике вы держите свое основное направление развития.В папке веток вы можете создавать ветки, которые сложно объяснить в коротком сообщении.

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

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

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

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

А ствол — это линия разработки, содержащая новейший исходный код и функции.В нем должны быть исправлены последние ошибки, а также новейшие функции, добавленные в проект.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Каталог ветвей предназначен для хранения ваших ветвей, какими бы они ни были.

Каталог тегов в основном предназначен для маркировки определенного набора файлов.Вы делаете это для таких вещей, как выпуски, где вы хотите, чтобы «1.0» были этими файлами в этих ревизиях, а «1.1» — этими файлами в этих редакциях.Обычно вы не изменяете теги после их создания.Дополнительную информацию о тегах см. Глава 4.Ветвление и слияниеКонтроль версий с помощью Subversion).

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

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

Я думаю, это то, что обычно подразумевают под «тегом».Но в Subversion:

Они не имеют никакого формального значения.Папка — это папка для SVN.

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

Или, возможно, я только что использовал CVS слишком долго.

Я думаю, что некоторая путаница возникает из-за разницы между концепцией тега и реализацией в SVN.Для SVN тег — это ветвь, которая является копией.Изменение тегов считается неправильным, и на самом деле такие инструменты, как TortoiseSVN, предупредят вас, если вы попытаетесь изменить что-либо с помощью ../tags/..в пути.

Я не совсем уверен, что такое «тег», но ветвь — довольно распространенная концепция управления версиями.

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

Сначала вы создадите ветку.По сути, это копия ствола на тот момент, когда вы создали ветку.Тогда вы будете делать всю свою работу в филиале.Любые изменения, внесенные в ветку, не влияют на магистраль, поэтому магистраль по-прежнему можно использовать, позволяя другим продолжать работать в ней (например, исправлять ошибки или небольшие улучшения).Как только ваша функция будет завершена, вы интегрируете ветку обратно в магистраль.Это переместит все ваши изменения из ветки в магистраль.

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

Вот Запись в Википедии о ветках, поскольку они, вероятно, объясняют вещи лучше, чем я.:)

Для людей, знакомых с GIT, мастер в GIT эквивалентен транку в SVN.

Ветка и тег имеют одинаковую терминологию как в GIT, так и в SVN.

Ствол :После завершения каждого спринта в Agile мы получаем частично готовый к отправке продукт.Эти выпуски хранятся в багажнике.

Ветви :Все коды параллельных разработок для каждого текущего спринта хранятся в ветках.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top