Как DVCS используется в больших командах?
Недавно я начал входить в Git в личном проекте, и я вижу, как DVCS может принести нам пользу на работе (которая является крупной корпоративной софтверной компанией, в настоящее время использующей Perforce). Особенная работа в моей команде, в основном, состоит из разработчиков, создающих собственные ветки; иногда они распределяются между небольшими командами разработчиков. Я думаю, что в этом случае было бы более эффективно использовать DVCS.
В более общем случае мне было бы интересно услышать от людей, которые используют DVCS на работе, в средних и больших командах.
- Как вы справляетесь с слияниями N-way? Это даже общий сценарий? Mercurial поддерживает только N-образные слияния путем выполнения (N-1) двухсторонних слияний (и читать, что это предпочтительное решение в других DVCS), что звучит как очень трудоемкий процесс даже для относительно небольшого N.
- Используете ли вы один центральный авторитетный репозиторий, или это действительно P2P?
- Разве разработчики часто нажимают и вытаскивают код друг в друга и друг от друга, или все идет через центральный репозиторий?
Ответы
Ответ 1
Моя команда у моего предыдущего работодателя использовала Git, и это сработало для нас. Мы были не такими большими (может быть, 16 или около того, возможно, 8 действительно активных коммиттеров?), Но у меня есть ответы на ваши вопросы:
- Слияния N-Way не очень распространены. Мы придумали некоторые соглашения об именах веток, которые позволили нам написать сценарии, которые облегчили процесс разработки "выпуска" (я использую кавычки, потому что у нас не было инженера по выпуску), и люди создавали бы частные ветки функций, но мы редко возникла проблема с объединением более двух ветвей (см. следующий).
- (и # 3). У нас было центральное хранилище на сервере разработки по трем причинам: (a) У машины разработки был RAID5 (более отказоустойчивый) и ночные резервные копии (рабочие станции не были ночными), (b) производственные версии были созданы на сервере разработки, и (c) с упрощенным сценарием центрального репозитория. В результате слияния N-way просто никогда не происходили. Самое близкое, что мы имели к N-образному пути, было когда кто-то сливался в боковом направлении, а затем сливался вертикально.
Git был для нас действительно отличным результатом благодаря своей высокой гибкости; однако нам нужно было установить некоторые соглашения (имена ветвей и тегов, места репо, сценарии и т.д., процесс), или это могло быть немного хаотичным. Как только мы получили настройки, гибкость, которую мы имели, была просто фантастической.
Обновление: наши соглашения в основном были такими:
- каталог на нашем сервере NFS, в котором размещены все центральные репозитории
- у нас было несколько проектов, которые разделяли компоненты, поэтому мы разбили их в библиотеках, по существу, своими собственными репозиториями, а поставляемые проекты просто включили их в качестве подмодулей git.
- были строки версий и имена релизов, наложенные на нас сверху, поэтому мы использовали только варианты имен в виде ветвей
- аналогично, для тегов они следовали за именами, продиктованными процессом
- в поставляемых проектах содержался файл свойств, который я прочитал в сценариях оболочки, и это позволило мне написать один script для управления процессом выпуска для всех проектов, хотя у каждого из них были небольшие изменения в процессе - изменения были учтены в этих файлах свойств.
- Я написал сценарии, которые перестраивали бы поставляемый пакет из любого тега
- с помощью git позволило нам контролировать доступ с использованием PAM и/или обычных разрешений пользователя (ssh и т.д.)
- Были и другие соглашения, которые сложнее ввести в маркированный список, например, когда должны произойти слияния. Действительно, я и еще один парень были своего рода гуру git, и мы помогли каждому понять, как использовать ветки и когда сливаться.
- заставить людей совершать мелкие куски, а не бросать дифракции в мастер-ветку, было проблемой. Один парень опустил около двух целых недель работы в одну сделку, и нам в конечном итоге пришлось все это распутать. Огромная трата времени и разочарование для всех.
- информативные и подробные комментарии, чтобы идти с фиксацией
Были и другие вещи, которые вы узнали по мере того, как ваша команда испытывает опыт и учится работать друг с другом, но этого было достаточно, чтобы мы начали.
Обновление: любой, кто после таких вещей уже знает об этом, уже знает об этом, но Винсент Дрейссен написал прочный и довольно всеобъемлющий (но не exaustive) использует технологию ветвления и выпуска, используя Git. Я очень хотел бы использовать его процесс в качестве отправной точки, потому что по двум причинам:
- многие команды делают это так или используют какой-то близкий вариант (включая Linux, Git и многие другие команды проекта OSS), что означает, что этот метод был протестирован и оптимизирован для успеха в большинстве случаев. Вы вряд ли столкнетесь с проблемой, с которой не сталкивались и не решались в рамках ограничений этой модели.
- Из-за вышеизложенного почти любой инженер с опытом git поймет, что происходит. Вам не нужно будет писать подробную документацию о фундаментальной природе вашего процесса выпуска; вам нужно будет только документировать вещи, относящиеся только к вашему проекту или команде.
Ответ 2
Схема рабочего потока из whygitisbetterthanx:
alt git рабочий поток с менеджером интеграции http://whygitisbetterthanx.com/images/workflow-b.png
Чтобы масштабировать это до еще большего числа разработчиков, вы просто добавляете еще один слой "доверенных лейтенантов" между менеджером интеграции и разработчиками.
Ответ 3
Я работаю несколько лет с командой компилятор Glasgow Haskell, используя Darcs. Недавно (несколько месяцев) я начал использовать git для своей копии репо, как для производительности, так и для улучшения моего образования.
-
Как вы справляетесь с слияниями N-way?
Слияний N-way нет. Каждый разработчик создает поток патчей, и потоки объединяются по одному за каждый репо. Поэтому, если разработчики N одновременно вносят изменения, они объединяются в них попарно.
-
Используете ли вы один центральный авторитетный репозиторий?
Совершенно верно. Это единственный способ рассказать, что такое GHC, а что нет.
-
Разве разработчики часто нажимают и вытаскивают код друг другу и друг от друга, или все идет через центральный репозиторий?
Я думаю, что это зависит от разработчиков и VCS, которые вы используете. В проекте GHC почти все тяги и толки, которые я вижу, проходят через центральный репозиторий. Но там супертяжеловес (самоуправляемый) привратник нажимает на центральный репо, и если у коллеги есть исправление ошибки, которое мне нужно сейчас, я вытащу его прямо из своего репо. С darcs очень легко вытащить только один патч (а не все состояние, как в git), и я знаю, что мои коллеги-разведчики, у которых больше опыта работы с дарками, используют эту функцию намного больше, чем я, - и им это очень нравится.
С git
, когда я тесно сотрудничаю с другим разработчиком, я часто создаю новую ветку только для того, чтобы поделиться ею с другим человеком. Эта ветка никогда не ударит по центральному репо.
Ответ 4
Известный "Tech Talk: Linus Torvalds on git" объясняет, как он используется для Linux (примерно такой же большой, как команда, о чем я могу думать)
Если я правильно помню, это использовалось как военная цепочка команд - каждый модуль имеет сопровождающего, который обрабатывает запросы на запросы от разработчиков, а затем несколько "самых доверенных" людей, которые занимаются вытаскиванием данных из модуля в официальный репозиторий kernel.org git.
"Linux: управление источником ядра с помощью git" также объясняет это, хотя опять же это вряд ли краткое объяснение.
Ответ 5
Вот один пример (отнюдь не "универсальный" )
У нас есть центральный VCS (ClearCase или SubVersion, в зависимости от разных проектов), и мы используем их для "официальных" разработок (dev, patches, fixes), где количество веток ограничено и хорошо идентифицировано.
Однако для реорганизации разработок, связанных с большим количеством промежуточного состояния, где ничего не работает, и где многим разработчикам необходимо иметь собственную ветвь или ветвь на основе действий, некоторые репозитории Git устанавливаются между этими разработчиками в P2P способ.
После того, как работа достигнет некоторой стабильности 0,1, а слияния сократятся, ее снова импортируют в VCS, где работа может продолжаться "упорядоченным" центральным способом.
Так как Git в Windows работает хорошо (MSysGit), нам удается быстро выполнить небольшие начальные разработки на стороне.
Мы все еще оцениваем Git для полномасштабной разработки проекта.
Ответ 6
Вероятно, лучше всего посмотреть, как работают разработчики ядра Linux. У них довольно сложный рабочий процесс, в котором изменения представлены из многих источников, а затем доверенные разработчики для каждой подтипы (называемые лейтенантами) втягивают изменения, и когда они счастливы представить их Линусу, который в конечном итоге либо втягивает их в свое дерево, либо отвергает их. Конечно, это сложнее, но это общий обзор.