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


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

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

17 1139

17 ответов:

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

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

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

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

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

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

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

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

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

  • Теги: каждый раз, когда вы выпускаете версию (final release, release candidates (RC) и betas), вы делаете тег для нее. Это дает вам копию кода на момент времени, как это было в этом состоянии, что позволяет вам вернуться и воспроизвести любые ошибки, если это необходимо в прошлой версии, или повторно выпустить прошлую версию точно так же, как это было. Ветви и теги в 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 release version

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

  • trunk / - версия разработки, скоро будет 1.1
  • филиалы/1.0 - предстоящий релиз 1.0.1
  • теги / 1.0.0 - 1.0.0 release version

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

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

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

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

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

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


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

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

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


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

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

enter image description here

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

у него есть учебник о том, как использовать SVN и что означают фразы "trunk", " tag " и "branch".

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

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

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

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

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

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

каталог тегов в основном предназначен для маркировки определенного набора файлов. Вы делаете это для таких вещей, как релизы, где вы хотите, чтобы "1.0" были этими файлами в этих версиях и "1.1" были этими файлами в этих версиях переделки. Вы обычно не изменяете теги, как только они сделаны. Дополнительные сведения о тегах см. В разделе Глава 4. Ветвление и слияние (in контроль версий с Subversion).

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

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

Я думаю, что это то, что обычно понимается под "тегом". Но в Subversion:

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

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

или, возможно, я просто использую CVS слишком долго.

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

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

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

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

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

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

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

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

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

Теги - Это папка, которая позволяет делать снимки вашего приложения, и работайте только с этими конкретными "сборками". Это обеспечивает гибкость вашей команды, как в тестировании, так и в поиске различий между сборками. Вы часто найдете соглашение об именовании, которое следует в / Branch, которое относится к вашим сборкам, т. е. /Отделение/2.0.0, /Филиал/2.0.1, /Филиал/3.1.0 и так далее. Соглашение об именах зависит от вас и вашей команды; держите его последовательным!

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

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

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

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

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