Ви повинні робити і те, і інше .
Почніть з прийнятої відповіді від @Norman: Використовуйте одне сховище з однією названою гілкою за випуск.
Тоді мати один клон на гілку випуску для побудови та тестування.
Одне ключове зауваження полягає в тому, що навіть якщо ви використовуєте кілька сховищ, вам слід уникати transplant
переміщення наборів змін між ними, оскільки 1) він змінює хеш, і 2) він може вводити помилки, які дуже важко виявити, коли між набором змін змінюються конфліктні зміни трансплантації та цільової гілки. Ви хочете зробити звичайне злиття замість цього (і без прем'єру: завжди візуально перевіряйте злиття), в результаті чого @mg сказав наприкінці своєї відповіді:
Графік може виглядати інакше, але він має однакову структуру, і кінцевий результат той самий.
Більш докладно, якщо ви використовуєте кілька репозиторіїв, сховище "trunk" (або за замовчуванням, основне, розробка, будь-яке інше) містить ВСІХ наборах змін у ВСІХ сховищах. Кожне сховище випуску / гілки - це просто одна гілка в магістралі, всі об'єднані назад в одну сторону або назад назад до магістралі, поки ви не захочете залишити старий реліз позаду. Тому єдиною реальною різницею між цим основним репо і єдиним репо в названій схемі гілок є просто те, чи гілки названі чи ні.
Це повинно дати зрозуміти, чому я сказав "почніть з одного репо". Це єдине репо - це єдине місце, де вам потрібно буде шукати будь-який набір змін у будь-якому випуску . Ви можете додатково позначити набори змін на гілках випуску для версії. Це концептуально зрозуміло і просто, і робить системного адміністратора більш простим, оскільки це єдине, що абсолютно має бути доступним і відновлюваним постійно.
Але тоді вам потрібно підтримувати один клон на гілку / випуск, який потрібно створити та протестувати. Це банально, як ви можете hg clone <main repo>#<branch> <branch repo>
, і тоді hg pull
у репо гілки витягуватимуться лише нові набори змін на цій гілці (плюс набори змін предків на попередніх гілках, які були об'єднані).
Ця настройка найкраще підходить для моделі Linux-ядра, що займається одним знімачем (чи не так добре діяти, як лорд Лінус. У нашій компанії ми називаємо рольовий інтегратор ), оскільки головне репо - це єдине, що розробникам потрібно клонувати, і знімач потрібно втягнути. Технічне обслуговування філійних репостів призначене виключно для управління випусками і може бути повністю автоматизовано. Розробникам ніколи не потрібно тягнути з / до гілки репостів.
Ось приклад @ mg, перероблений для цієї установки. Відправна точка:
[a] - [b]
Створіть названу гілку для версії релізу, скажіть "1.0", коли ви перейдете до альфа-релізу. Вчиніть на ньому виправлення помилок:
[a] - [b] ------------------ [m1]
\ /
(1.0) - [x] - [y]
(1.0)
не є реальним набором змін, оскільки названа гілка не існує, поки ви не скористаєтесь. (Ви можете зробити тривіальне зобов’язання, наприклад, додати тег, щоб переконатися, що названі гілки правильно створені.)
Злиття [m1]
- це ключ до цієї установки. На відміну від сховища розробників, де може бути необмежена кількість заголовків, ви НЕ хочете мати кілька головок у вашому головному репо-рене (за винятком старої, мертвої гілки випуску, як згадувалося раніше). Отже, коли у вас є нові набори змін на гілках випуску, ви повинні негайно об'єднати їх до гілки за замовчуванням (або пізнішої гілки випуску). Це гарантує, що будь-яке виправлення помилок в одному випуску також міститься у всіх пізніших випусках.
Тим часом розвиток на гілці за замовчуванням продовжується до наступного випуску:
------- [c] - [d]
/
[a] - [b] ------------------ [m1]
\ /
(1.0) - [x] - [y]
І, як завжди, вам потрібно з’єднати дві голови на гілці за замовчуванням:
------- [c] - [d] -------
/ \
[a] - [b] ------------------ [m1] - [m2]
\ /
(1.0) - [x] - [y]
А це клон 1,0 гілки:
[a] - [b] - (1.0) - [x] - [y]
Тепер вправа додати наступну гілку випуску. Якщо це 2.0, то він обов'язково відгалужує за замовчуванням. Якщо це 1,1, ви можете відключити 1,0 або за замовчуванням. Незважаючи на те, будь-який новий набір змін на 1.0 повинен бути спочатку об'єднаний у наступну гілку, а потім у типову. Це можна зробити автоматично, якщо немає конфлікту, що призведе до простого злиття.
Я сподіваюся, що приклад чітко пояснює мої попередні моменти. Підсумовуючи переваги цього підходу, є:
- Єдине авторитетне сховище, яке містить повний набір змін та історію версій.
- Чітке та спрощене управління випусками.
- Чіткий та спрощений робочий процес для розробників та інтегратора.
- Полегшення ітерацій робочого процесу (огляди коду) та автоматизації (автоматичне порожнє злиття).
ОНОВЛЕННЯ hg сам робить це : основне репо містить стандартні та стабільні гілки, а стабільне репо - стабільний клон гілки. Однак він не використовує розгалужену гілку, оскільки теги версій у стабільній гілці досить хороші для цілей управління випуском.