Я - еще один пользователь Subversion, пытающийся переучиться на Дао распределенного контроля версий.
Когда я использовал Subversion, я был большим поклонником подхода с незначительными проектами, и, с большинством моих бывших работодателей, мы структурировали наши филиалы репозитория; теги и багажник следующим образом:
branches-+
+-personal-+
| +-alice-+
| | +-shinyNewFeature
| | +-AUTOMATED-+
| | +-shinyNewFeature
| +-bob-+
| +-AUTOMATED-+
| +-bespokeCustomerProject
+-project-+
+-shinyNewFeature
+-fixStinkyBug
tags-+
+-m20110401_releaseCandidate_0_1
+-m20110505_release_0_1
+-m20110602_milestone
trunk
В самом фактическом исходном дереве мы будем использовать (что-то вроде) следующую структуру:
(src)-+
+-developmentAutomation-+
| +-testAutomation
| +-deploymentAutomation
| +-docGeneration
| +-staticAnalysis
| +-systemTest
| +-performanceMeasurement
| +-configurationManagement
| +-utilities
+-libraries-+
| +-log-+
| | +-build
| | +-doc
| | +-test
| +-statistics-+
| | +-build
| | +-doc
| | +-test
| +-charting-+
| | +-build
| | +-doc
| | +-test
| +-distributedComputing-+
| | +-build
| | +-doc
| | +-test
| +-widgets-+
| +-build
| +-doc
| +-test
+-productLines-+
| +-flagshipProduct-+
| | +-coolFeature
| | +-anotherCoolFeature
| | +-build
| | +-doc
| | +-test
| +-coolNewProduct
+-project-+
+-bigImportantCustomer-+
| +-bespokeProjectOne
| +-bespokeProjectTwo
+-anotherImportantCustomer-+
+-anotherBespokeProject
Идея состояла в том, чтобы (и все еще остается) использовать структуру хранилища, чтобы помочь структурировать взаимодействие между командой разработчиков; ориентированная на клиента часть бизнеса и различные другие заинтересованные стороны и эксперты в данной области.
То есть: исходные документы, которые находятся в одном из каталогов «проекта», используются (и зарабатывают деньги) только один раз. Документы, которые находятся в одном из каталогов «productLines», зарабатывают столько раз, сколько продается продукт из этой конкретной линии. Документы, которые находятся в одном из «библиотечных» каталогов, зарабатывают столько раз, сколько продается любой из продуктов, которые их используют.
Это делает понятие амортизации затрат явным и помогает обеспечить поддержку повторного использования исходного документа в рамках всего бизнеса.
Это также означает, что существует общая структура, над которой могут работать наши инструменты автоматизации сборки. (Наши сценарии компоновки обходят дерево исходных текстов в поисках папок «компоновки», в которых они находят файлы конфигурации, определяющие, как должен создаваться каждый компонент; аналогичный процесс происходит для генерации и тестирования документации).
Важно отметить, что для продуктов, над которыми я работаю, обычно требуется ДЛИННОЕ время для проведения тестов измерения и характеристики производительности; от 20 до 200 часов; генерирование от нескольких ГБ до нескольких ТБ обработанных результатов испытаний / промежуточных данных (которые должны храниться и привязываться к конкретной конфигурации системы, чтобы можно было измерить улучшение производительности во времени). Эта проблема делает управление конфигурацией важным фактором, а также предъявляет некоторые требования к централизации, поскольку обычно вычислительные ресурсы, необходимые для выполнения измерений производительности и тестов характеристик, ограничены; (небольшой кластер из 64-128 ядер).
В качестве одного последнего замечания; система непрерывной интеграции знает, что она должна инициировать сборку; статический анализ; Тест дыма и модульный тест запускаются каждый раз, когда ствол изменяется, каждый раз, когда изменяется любая ветка «tag», и каждый раз, когда изменяется любая ветка «AUTOMATED». Таким образом, отдельные разработчики могут использовать систему CI со своими персональными ветвями, что является важной возможностью, IMHO.
Теперь мой вопрос: как я могу воспроизвести все вышеперечисленное (и улучшить его, если это возможно) с Mercurial.
--редактировать:
В настоящее время я думаю об использовании центрального хранилища Subversion, чтобы определить общую структуру, но разрешить использование hg в качестве клиента, чтобы разработчики могли иметь репозитории, доступные локально.