Що означають "гілка", "тег" та "магістраль" у сховищах Subversion?


1193

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

Що вони означають?


29
Ось хороша стаття, яку я наткнувся, пояснюючи, як / коли використовувати магістраль, гілку та теги. Я раніше не використовував контроль над джерелами, але ця стаття зробила це досить легким для нооба, як я. Щоденний день із Subversion
Badmoon

Відповіді:


910

Хм, не впевнений, що я згоден з тим, що тег Ніка повторюється як гілка. Тег - це лише маркер

  • Багажник був би основним органом розвитку, починаючи від початку проекту до сьогодення.

  • Відділення - це копія коду, отриманого з певної точки стовбура, яка використовується для застосування основних змін до коду при збереженні цілісності коду в магістралі. Якщо основні зміни працюють за планом, вони зазвичай зливаються назад у магістраль.

  • Тег буде моментом часу на стовбурі або гілці, який ви хочете зберегти. Дві основні причини збереження полягають у тому, що або це основний випуск програмного забезпечення, будь то альфа, бета, RC або RTM, або це найбільш стабільна точка програмного забезпечення до того, як були застосовані основні зміни на магістралі.

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

Підтрубки гілки та тегів відрізняються від стовбура такими способами:

Subversion дозволяє sysadmins створювати сценарії гаків, які запускаються для виконання, коли відбуваються певні події; наприклад, внесення змін у сховище. Для типової реалізації сховища Subversion дуже часто трактувати будь-який шлях, що містить "/ tag /", захищений від запису після створення; Чистий результат полягає в тому, що теги, щойно створені, незмінні (принаймні "звичайним" користувачам). Це робиться за допомогою скриптів гака, які забезпечують незмінність, запобігаючи подальшим змінам, якщо тег є батьківським вузлом зміненого об'єкта.

Subversion також має додаткові можливості, оскільки версія 1.5 стосується "відстеження злиття гілок", щоб зміни, здійснені до гілки, могли бути об'єднані назад у магістраль із підтримкою інкрементального, "розумного" злиття.


284
Плутанина з тегами та гілками полягає в тому, що в svn дійсно немає різниці між ними, окрім назви каталогу. У svn ви можете вносити зміни до тегу, і насправді це важко запобігти. Більшість інших VCS розглядають теги як незмінні знімки (моменти часу).
Кен Лю

4
TagsКаталог також часто використовується для тестування етапів і перевірки звичайним користувачем. Це було б хорошим місцем, щоб поставити прототип теж (лише кілька ідей на мою голову).
Джефф Ноель

6
@KenLiu Є гачки, які можуть зробити теги незмінними. Тобто ви можете створити та оформити замовлення на тег, але не вносити жодних змін. Звичайно, тег, що є лише частиною сховища, означає повну історію. Якщо хтось змінить тег, ви можете відстежити це і чому. У багатьох VCS, якщо ви змінюєте тег, можливо, це не може бути ніяким способом.
David W.

3
Можливо, слід згадати стабільні гілки : зміни, внесені там, зазвичай не зливаються назад у стовбур .
Вовк

4
Я розумію, що в "ідеальному світі" жодна розробка не повинна відбуватися в магістралі, магістраль завжди повинна бути або точним кодом, який знаходиться в прямому ефірі, або кодом, який збирається випустити в прямому ефірі. як такий, який би зробив гілки основним органом розвитку.
MikeT

556

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

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

  • Багажник : Основна зона розвитку. Тут проживає ваш наступний головний випуск коду і, як правило, є всі новітні функції.

  • Гілки : Щоразу, коли випускаєте основну версію, вона створюється гілкою. Це дозволяє робити виправлення помилок та робити новий реліз, не випускаючи нові - можливо незавершені чи неперевірені - функції.

  • Теги : Щоразу, коли випускаєте версію (остаточний реліз, випуск кандидатів (RC) та бета-версії), ви робите тег для неї. Це дає точну копію коду, як він був у тому стані, що дозволяє вам повернутися назад і відтворити будь-які помилки, якщо це необхідно, в минулій версії, або повторно випустити попередню версію саме такою, якою вона була. Гілки та теги в SVN легкі - на сервері він не робить повну копію файлів, лише маркер, який говорить "ці файли були скопійовані під час цього перегляду", який займає лише кілька байт. Зважаючи на це, ви ніколи не повинні турбуватися про теги для будь-якого випущеного коду. Як я вже говорив раніше, теги часто опускаються, і замість цього, журнал змін або інший документ уточнює номер версії, коли робиться випуск.


Наприклад, скажімо, ви починаєте новий проект. Ви починаєте працювати в "магістралі", над тим, що з часом вийде у версії 1.0.

  • trunk / - версія розробки, незабаром буде 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
  • теги / 1.1beta1 - 1.1 версія бета-версії 1

Після випуску 1.1 фіналу ви робите тег "1.1" з гілки "1.1".

Ви також можете продовжувати підтримувати 1,0, якщо хочете, переносячи виправлення помилок між усіма трьома гілками (1.0, 1.1 та стовбуром). Важливим рішенням є те, що для кожної основної версії програмного забезпечення, яке ви підтримуєте, у вас є відділення, яке містить останню версію коду для цієї версії.


Ще одне використання гілок - для функцій. Тут ви здійснюєте відділення магістралі (або одного з відділень випуску) та працюєте над новою функцією ізольовано. Після завершення функції ви об’єднуєте її назад і виймаєте гілку.

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

Ідея цього полягає в тому, коли ви працюєте над чимось руйнівним фактором (яке б стримувало чи заважало іншим людям виконувати свою роботу), щось експериментальне (що може навіть не встигнути) або, можливо, просто щось, що потребує тривалого часу (і ви боїтесь, якщо він містить 1.2 випуску, коли ви готові відгалужувати 1.2 від магістралі), ви можете це зробити ізольовано у гілці. Як правило, ви постійно оновлюєте його магістраллю, постійно об'єднуючи зміни, що полегшує повторну інтеграцію (злиття назад до магістралі), коли ви закінчите.


Також зауважте, що використана тут схема версій - лише одна з багатьох. Деякі команди виконують виправлення помилок / випуски технічного обслуговування як 1.1, 1.2 та ін., А також значні зміни, як 1.x, 2.x, тощо. Використання тут те саме, але ви можете назвати гілку "1" або "1 .x "замість" 1.0 "або" 1.0.x ". (Окрім того, семантична версія є хорошим посібником щодо того, як робити номери версій).


6
@baruch - Це абсолютно неправильно. Теги мають невелику вагу і є (що стосується самої Subversion) ідентичними гілкам.
Джош Келлі

7
Любіть деталі у випадку використання. Дякую @gregmac
Jeromy French

2
Чи можу я отримати цитату про те, де зазначено, що теги / гілки легкі? Мабуть, не так ..
Кардін Лі Дж

3
Це має бути прийнята відповідь, яка набагато краща ^^
Нам G VU

4
@Cardin Я зараз не маю посилання, але важливо відзначити теги - це легка вага на сервері, але не клієнт. Якщо ви оформили всі теги, ви отримаєте стільки повноцінних примірників. Однак якщо подивитися розмір сховища на сервері, він збільшиться лише на кілька байт на тег. Ось чому не слід перевіряти кореневий каталог, взагалі кажучи.
gregmac

97

Окрім сказаного Ніком, ви можете дізнатися більше на Streamed Lines: Розгалуження моделей для паралельної розробки програмного забезпечення

введіть тут опис зображення

На цій фігурі mainстовбур, rel1-maintє гілка і 1.0є тегом.


1
@Вовк, яким він міг бути - ця схема є досить загальною незалежно від інструментарію. Усі SCM використовують різні слова, але однакові поняття, різниця між магістраллю та Main не має різниці; або ствол і господар. Ця діаграма показує, як моя поточна компанія використовує SVN.
gbjbaanb

@gbjbaanb Дякуємо за обмін. ... і теги, схоже, не вирішуються питанням. Чи чистий збіг (також у вашій нинішній компанії), що жодні злиття не переходять від основних до підтримуваних філій?
Вовк

@Wolf Не випадково - тільки гілка зі стовбура, робота, злиття назад на стовбур. Потім відгалужте ствол до гілки тегів. Ми розглядаємо ще один "стовбур" під назвою Integration, який закінчив гілки, об'єднані до нього для тестування, що не є випуском, магістраль все ще використовується для тих гілок, які ми вирішимо розмістити в наступному випуску. Єдиний час, коли ви зливаєтесь із стовбура у гілку, - це оновити давно працюючу гілку, але краще (і простіше) просто створити нову гілку зі стовбура та об'єднати зміни вашої старої гілки до неї, якщо вам це потрібно.
gbjbaanb

75

Загалом (інструментальний агностичний погляд) гілка - це механізм, який використовується для паралельного розвитку. SCM може мати від 0 до n відділень. Субверсія має 0.

  • Магістраль - це головна галузь, яку рекомендує Subversion , але ви її жодним чином не змушені створювати. Ви можете назвати це "головним" або "випуском", або його взагалі немає!

  • Відділення являє собою зусилля з розвитку. Він ніколи не повинен бути названий на ресурс (наприклад, 'vonc_branch'), але після:

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

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

Тег остаточний. Його зміст ніколи не повинен змінюватися. НІКОЛИ. Колись. Ви забули рядок у примітці до випуску? Створіть новий тег. Застаріле або видаліть старе.

Зараз я багато читав про "злиття таких і таких у таких і таких гілках, потім нарешті в стовбуровій гілці". Це називається об'єднати робочий процес, і тут немає нічого обов'язкового . Це не тому, що у вас є гілка стовбура, ви повинні злити назад все.

За умовою, гілка магістралі може представляти поточний стан вашого розвитку, але це для простого послідовного проекту, тобто проекту, який має:

  • немає "заздалегідь" розробки (для підготовки наступної-наступної версії, що передбачає такі зміни, що вони не сумісні з поточною розробкою "магістралі")
  • відсутність масового рефакторингу (для тестування нового технічного вибору)
  • відсутність довгострокового обслуговування попереднього випуску

Тому що за допомогою одного (або всього) цього сценарію ви отримуєте собі чотири "стволи", чотири "поточні розробки", і не все, що ви робите в цих паралельних розробках, обов'язково доведеться об'єднати назад у "багажник".


38

У SVN тег та гілка дійсно схожі.

Тег = визначений фрагмент за часом, який зазвичай використовується для випусків

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

Trunk = робочий простір для розробки, саме тут має відбуватися вся розробка, а потім зміни, об'єднані назад з гілками випусків.


30

Вони насправді не мають жодного формального значення. Папка - це папка для SVN. Вони є загальноприйнятим способом організації вашого проекту.

  • Стовбур - це місце, де ви тримаєте свою основну лінію розвитку. Папка гілок - це те, де ви можете створити гілки, які важко пояснити за короткий пост.

  • Гілка - це копія підмножини вашого проекту, над якою ви працюєте окремо від магістралі. Можливо, це для експериментів, які нікуди не підуть, або, можливо, це для наступного випуску, який ви згодом злинете назад у магістраль, коли він стане стабільним.

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

Але, як я вже сказав, у SVN папка - це папка. branch, trunkа тег - лише умова.

Я вживаю слово "копіювати" вільно. SVN насправді не робить повних копій речей у сховищі.


13

Стовбур є лінія розвитку , яка містить останню версію вихідного коду і функції. У ньому повинні бути найновіші виправлення помилок, а також останні функції, додані до проекту.

Ці гілки зазвичай використовуються , щоб зробити що - то від стовбура (або іншої лінії розвитку) , які могли б порушити збірку. Нові функції часто вбудовуються у гілку, а потім зливаються назад у стовбур. Гілки часто містять код, який не обов'язково затверджується для лінії розробки, на яку він розгалужений. Наприклад, програміст може спробувати оптимізувати щось у гілці та об'єднатись лише в лінію розробки, коли оптимізація задовільна.

Ці теги моментальні знімки сховища в певний момент часу. Ніяких розробок щодо цього не повинно відбуватися. Вони найчастіше використовуються для отримання копії того, що було випущено клієнту, щоб ви могли легко отримати доступ до того, чим користується клієнт.

Ось посилання на дуже хороший посібник із сховищ:

Статті у Вікіпедії також варто прочитати.


12

Тепер справа в розробці програмного забезпечення, немає нічого послідовного знання про що-небудь, схоже, у кожного це є по-своєму, але це тому, що це все одно порівняно молода дисципліна.

Ось мій простий спосіб,

trunk - Каталог магістралей містить найновіший, затверджений і об'єднаний корпус роботи. Всупереч тому, що багато хто зізнався, мій багажник призначений лише для чистої, акуратної, затвердженої роботи, а не для розвитку, а скоріше для зони випуску.

У якийсь момент часу, коли магістраль видається всім готовим до випуску, він помічається та відпускається.

відділення - Каталог гілок містить експерименти та поточну роботу. Робота під гілкою залишається там, поки не буде затверджено об'єднання в багажник. Для мене це сфера, де виконується вся робота.

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

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

Я гадаю, що за допомогою тегів я можу стрибати туди-сюди, щоб досить просто вказувати на інтерес.


10

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

У нього є підручник про те, як використовувати SVN та що означають фрази "стовбур", "тег" та "гілка".

Цитується безпосередньо з його підручника:

Поточна версія вашого програмного проекту, над якою зараз працює ваша команда, зазвичай знаходиться під каталогом, який називається trunk . По мірі розвитку проекту розробник оновлює цю версію, виправляє помилки, додає нові функції) та надсилає його зміни під цей каталог.

У будь-який момент часу, можливо, ви захочете заморозити версію та зробити знімок програмного забезпечення, як це є на даному етапі розробки. Зазвичай це відповідає офіційним версіям вашого програмного забезпечення, наприклад, тим, які ви доставите своїм клієнтам. Ці знімки розміщені в каталозі тегів вашого проекту.

Нарешті, часто корисно створити в якийсь момент нову лінію розробки для свого програмного забезпечення. Це відбувається, наприклад, коли ви хочете перевірити альтернативну реалізацію, в якій вам доведеться модифікувати програмне забезпечення, але ви не хочете подавати ці зміни до основного проекту, поки ви не вирішите, чи приймете ви нове рішення. Потім основна команда може продовжувати працювати над проектом, тоді як інші розробники працюють над прототипом. Ви б поклали ці нові лінії розвитку проекту під каталог, який називається гілками .


9

Каталог магістралей - це каталог, який ви, мабуть, найбільше знайомий, оскільки він використовується для проведення останніх змін. Ваша основна база даних повинна бути в магістралі.

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

Каталог тегів - це в основному для тегування певного набору файлів. Ви робите це для речей, як релізи, де ви хочете, щоб "1.0" були цими файлами в цих редакціях, а "1.1" були цими файлами при цих версіях. Зазвичай теги не змінюються після їх створення. Для отримання додаткової інформації про теги, див. Розділ 4. Розгалуження та об'єднання (у розділі " Управління версіями з підривом" )


9

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


8

Тег = визначений фрагмент за часом, який зазвичай використовується для випусків

Я думаю, що це зазвичай означає "тег". Але в Subversion:

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

що я вважаю досить заплутаним: система контролю ревізії, яка нічого не знає про гілки або теги. З точки зору реалізації, я вважаю, що підривний спосіб створення "копій" є дуже розумним, але мені потрібно знати про це те, що я би назвав хиткою абстракцією .

А може, я просто занадто довго використовував CVS .


Альтернативна точка зору полягає в тому, що справжнє протилежне, що накладення поняття тегів на об'єктну модель субверсії було б непрохідною абстракцією в протилежному напрямку. Як я здогадуюсь, ви знаєте, підрив був реакцією на CVS, спробою "зробити CVS правильно". Я не міг знайти посилання, але оригінальні дизайнери підривних програм сказали, що вони викинули концепцію тегів на 100% навмисно, що відмінність між гілками та тегами є суто політичним питанням. Якщо команди хочуть нав'язати політику та конвенцію на основі об'єктної моделі підривної роботи, так і нехай буде. Саме це ми маємо сьогодні.
Дарріл

6

Я думаю, що деяка плутанина походить від різниці між концепцією тегу та реалізацією в SVN. Для SVN тег - це гілка, яка є копією. Змінення тегів вважається неправильним, і насправді такі інструменти, як TortoiseSVN, попередить вас, якщо ви намагатиметесь щось змінити за допомогою ../tags/ .. на шляху.


5

Я не дуже впевнений, що таке "тег", але гілка є досить поширеною концепцією управління джерелами.

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

Спочатку ви створите філію. Це в основному копія стовбура часу, коли ви робили гілку. Потім ви зробите всю свою роботу у філії. Будь-які зміни, зроблені у гілці, не впливають на магістраль, тому магістраль все ще є корисною, що дозволяє іншим продовжувати працювати там (наприклад, робити помилки чи невеликі вдосконалення). Як тільки ваша функція буде виконана, ви інтегруєте гілку назад у стовбур. Це перемістить усі ваші зміни від гілки до стовбура.

Існує ряд моделей, які люди використовують для гілок. Якщо у вас є продукт, який підтримується відразу декількома основними версіями, зазвичай кожна версія буде галуззю. Де я працюю, у нас є філія якості та виробнича філія. Перш ніж випустити наш код до QA, ми інтегруємо зміни до гілки QA, а потім розгорнемо звідти. Випускаючи виробництво, ми інтегруємось із гілки якості до галузі виробництва, тому ми знаємо, що код, що працює у виробництві, ідентичний тому, який перевіряв QA.

Ось запис у Вікіпедії про гілки , оскільки вони, ймовірно, пояснюють речі краще, ніж я можу. :)


4

Багажник : Після завершення кожного спринту в спритності ми виходимо з частково поставляється продуктом. Ці випуски зберігаються в багажнику.

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

Теги : Щоразу, коли ми випускаємо бета-версію продукту, що частково постачається, ми робимо тег для цього. Це дає нам код, який був доступний в той момент часу, що дозволяє нам повернутися до цього стану, якщо це потрібно в якийсь момент під час розробки.


Це ваш конкретний робочий процес, він взагалі не застосовується.
Джейсон S

4

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.