Как DVCS используется в больших командах?

Недавно я начал заниматься Git в рамках личного проекта, и я вижу, как DVCS может принести нам пользу на работе (это крупная компания-разработчик программного обеспечения для предприятий, в настоящее время использующая Perforce). Например, работа над функциями в моей команде в основном состоит из разработчиков, создающих свои собственные ветки; иногда они делятся между небольшими группами разработчиков. Я думаю, что в этом случае было бы более эффективно использовать DVCS.

Однако в более общем случае мне было бы интересно услышать мнение людей, которые используют DVCS на работе, в средних и крупных командах.

  1. Как вы относитесь к N-образным слияниям? Это вообще распространенный сценарий? Mercurial поддерживает только N-стороннее слияние, выполняя (N-1) 2-стороннее слияние (и читать, что это предпочтительное решение для других DVCS), что кажется очень трудоемким процессом даже для относительно небольшого N.
  2. Вы используете единый центральный авторитетный репозиторий или это действительно P2P?
  3. Часто ли разработчики отправляют и извлекают код друг от друга или все идет через центральный репозиторий?

person alastairs    schedule 24.04.2009    source источник
comment
Я надеюсь, что он не скоро закончится, я думаю, что это действительно хороший вопрос. К сожалению, я не могу ответить - я использую git только в личных проектах, так как работа отстает от времени, я все еще использую CVS для некоторых проектов и svn для других. По большей части кажется, что люди, использующие svn, думают, что они современные. :-)   -  person Benson    schedule 25.04.2009
comment
Я думаю, вы найдете множество рабочих мест (например, мое), где настоящий ответ на этот вопрос будет конфиденциальным или без ведома остальной команды.   -  person Tim Whitcomb    schedule 25.04.2009
comment
К сожалению, лучший ответ был действительно для небольшой команды. Кто-нибудь делает это с командами 50–100+?   -  person Jeff Thompson    schedule 21.05.2009
comment
@Jeff: подход, который я описал ниже, очень масштабируем, с возможными оговорками: (1) вам может понадобиться кто-то в роли официального разработчика интеграции или релиз-инженера и (2) обучение основам управления версиями и методам git. Фактически, одна из причин, по которой мы выбрали git, которую я не обсуждал ниже, заключалась в том, что Git был лучшим выбором, позволяющим нам сотрудничать с другими группами независимо от их выбора инструмента управления версиями (или его отсутствия).   -  person Ben Collins    schedule 05.02.2010
comment
Предупреждение о пламени, а как насчет контроля версий с 50-100 командами? :-D   -  person HiQ CJ    schedule 21.09.2011


Ответы (6)


Моя команда у моего предыдущего работодателя использовала Git, и он нам хорошо помог. Мы не были такими уж большими (может быть, 16 или около того, может быть, 8 действительно активных коммиттеров?), Но у меня есть ответы на ваши вопросы:

  1. Слияние N-Way не очень распространено. Мы придумали некоторые соглашения об именах веток, которые позволили нам писать сценарии, которые упростили процесс «разработки релиза» (я использую запугивающие цитаты, потому что у нас не было инженера по выпуску), и люди создавали частные ветки функций, но мы редко возникла проблема с объединением более двух веток (см. следующую).
  2. (и №3). У нас был центральный репозиторий на сервере разработки по трем причинам: (а) машина для разработки имела RAID5 (более отказоустойчивый) и ночное резервное копирование (рабочие станции разработчиков не работали по ночам), (б) производственные выпуски создавались на сервере разработки, и (c) наличие центрального хранилища упрощенных сценариев. В результате N-образных слияний просто не произошло. Самое близкое, что у нас было к N-way, - это когда кто-то сливается по горизонтали, а затем сливается по вертикали.

Git был для нас действительно великим из-за его высокой степени гибкости; однако нам пришлось установить некоторые соглашения (имена веток и тегов, местоположения репо, сценарии и т. д., процесс), иначе это могло быть немного хаотично. После того, как мы установили соглашения, гибкость, которая у нас была, была просто фантастической.

Обновление: наши соглашения в основном были такими:

  • каталог на нашем сервере NFS, в котором размещались все центральные репозитории
  • у нас было несколько проектов с общими компонентами, поэтому мы разбили их на библиотеки, по сути, с их собственными репозиториями, а поставляемые проекты просто включали их как подмодули git.
  • сверху были навязаны строки версий и названия выпусков, поэтому мы просто использовали их варианты в качестве названий веток.
  • аналогично, для тегов они следовали названиям релизов, продиктованным процессом.
  • поставляемые проекты содержали файл свойств, который я читал в сценариях оболочки, и это позволило мне написать один сценарий для управления процессом выпуска для всех проектов, даже если у каждого из них были небольшие вариации процесса - вариации были учтены в этих файлах свойств
  • Я написал скрипты, которые пересобирали бы доставляемый пакет из любого тега
  • использование git позволило нам контролировать доступ с помощью PAM и / или обычных пользовательских разрешений (ssh и т. д.)
  • Были и другие соглашения, которые сложнее поместить в маркированный список, например, когда должно происходить слияние. На самом деле, я и еще один парень были в некотором роде внутренними «гуру», и мы помогли всем разобраться, как использовать ветки и когда их объединять.
  • Было непросто заставить людей делать коммиты небольшими кусками и не сбрасывать разностные бомбы в главную ветку. Один парень вложил около двух недель работы в одну фиксацию, и в конце концов нам пришлось все это распутать. огромная трата времени и разочарование для всех.
  • информативные и подробные комментарии к коммитам

Были и другие вещи, которым вы научились по мере того, как ваша команда набирается опыта и учится работать друг с другом, но этого было достаточно, чтобы мы начали.

Обновление: любой, кто следит за такими вещами, уже знает об этом, но Винсент Дрейссен написал солидный и довольно исчерпывающий (но не исчерпывающий) взять на себя разработку ветвления и выпуска с использованием Git. Я настоятельно рекомендую использовать его метод в качестве отправной точки по двум причинам:

  • многие команды делают это таким образом или используют какой-либо близкий вариант (включая Linux, Git и многие другие проектные группы OSS), что означает, что этот метод был протестирован и настроен для успеха в большинстве случаев. Маловероятно, что вы столкнетесь с проблемой, с которой не сталкивались и не решались в рамках ограничений этой модели.
  • Из-за вышесказанного практически любой инженер с опытом работы с Git поймет, что происходит. Вам не нужно будет писать подробную документацию о фундаментальной природе вашего процесса выпуска; вам нужно будет только задокументировать вещи, относящиеся только к вашему проекту или команде.
person Ben Collins    schedule 25.04.2009
comment
Я хотел бы получить больше информации о ваших соглашениях и примерах вашей гибкости. - person Norman Ramsey; 26.04.2009
comment
Я тоже :-) Я был в середине действительно пустого комментария, прежде чем @Norman пришел с этим! - person alastairs; 26.04.2009
comment
Что ж, один из способов, которым Git дает вам большую гибкость, - это то, что у него есть десятки программ, а не одна большая. Звучит запутанно, и это так, но это позволяет вам писать действительно мощные сценарии, перенаправляя вывод одной команды в другую. Это в значительной степени позволяет POSIX sh быть языком расширения Git. Если вы разбираетесь в написании сценариев оболочки, это очень, очень мощная вещь. Теперь, в 2013 году, Git стал более монолитным, но его интерфейс по-прежнему поддерживает множество сценариев, в том числе Windows. PowerShell также делает очень хороший язык расширения. - person Ben Collins; 26.04.2009
comment
Хммм, интересно, что вы упомянули о разностных бомбах ... У нас есть проблема с нашим развертыванием Perforce; разработчики часто используют ветки для работы над функциями или крупными ошибками (в этом нет проблем), но затем, когда дело доходит до интеграции этой ветки обратно в ствол, вы получаете ОГРОМНЫЙ коммит, проверка которого занимает вечность (и часто также проходит несколько раундов) ). Я бы подумал, что что-то вроде git, которое также объединяет историю ветки, будет лучшим решением. Может быть, это одна из тех проблем, которые сложно решить :-) - person alastairs; 26.04.2009
comment
Нет .... ветвление решает проблему с разностной бомбой в Git. Этот парень работал две недели, ничего не делая. Затем он просто свернул все в один коммит. Git действительно гибкий, но коммит - это атомарная единица. Единственный способ исправить это на этом этапе - слить его фиксацию без фиксации результатов и выборочно разбить изменения для фиксации слияния. - person Ben Collins; 26.04.2009
comment
Разногласий можно уменьшить, регулярно перетаскивая основную ветку в ветку разработки и не выполняя окончательное слияние в основной ветке. Т.е. вы интегрируете mainline в ветку и тестируете ее там. Тогда слияние с основной линией не является событием. Кроме того, вы можете затем выполнить частичное слияние обратно в основную ветку перед окончательной фиксацией. Если вы работаете над устаревшей версией изолированно (в ветке), вы напрашиваетесь на проблемы! То же самое для p4 или hg. - person Nick; 14.10.2009
comment
@Nick: вам не нужно делать регулярные слияния в git, чтобы избежать разностных бомб. Вам просто нужно обеспечить соблюдение соглашения о небольших коммитах. Как долго ветвь проходит без слияния, на самом деле не имеет значения для проблемы разностной бомбы. - person Ben Collins; 05.02.2010

Схема рабочего процесса из whygitisbetterthanx:

рабочий процесс alt git с менеджером интеграции
(источник: whygitisbetterthanx.com)

Чтобы охватить еще больше разработчиков, вы просто добавляете еще один уровень «доверенных помощников» между менеджером интеграции и разработчиками.

person Wim Coenen    schedule 26.04.2009
comment
На что могут переводить доверенные лейтенанты в деловой / частной среде? Ведущий специалист? Руководитель проекта? ;-) Я не уверен, что вижу, как это работает так хорошо, например, в моей команде, где у нас есть центральный репозиторий Perforce, доступ к которому есть у всех. Кажется неэффективным (и не очень распределенным ...) возлагать ответственность за интеграцию в благословенный репозиторий на одного человека. - person alastairs; 26.04.2009
comment
Еще одна особенность нашей команды заключается в том, что у нас нет четко определенных функций как таковых. Конечно, у каждого из нас есть собственный опыт в разных областях, но мы можем двигаться дальше, работая над разными областями продукта для разных проектов. Это могло бы сделать для нас недействительной модель интеграционного менеджера / диктатора-лейтенанта. - person alastairs; 26.04.2009
comment
В бизнес-среде, вероятно, лучше разделить проекты, если они становятся слишком большими для одного менеджера по интеграции. Но не стоит переоценивать работу, которую должен выполнять менеджер по интеграции: разработчики - это те, кто следят за тем, чтобы их общедоступные изменения четко сливались с HEAD благословенного репозитория. - person Wim Coenen; 26.04.2009
comment
Если вы не можете или не хотите обременять кого-либо ролью менеджера по интеграции, то вам, очевидно, нужно придерживаться централизованной модели, в которой каждый человек толкает / извлекает из центрального репозитория. Разработчики по-прежнему могут взаимодействовать друг с другом, если они хотят поделиться экспериментальными или еще не готовыми изменениями. - person Wim Coenen; 26.04.2009
comment
+1 потому что мне очень нравится термин благословенное хранилище. Довольно забавно. - person Ben Collins; 07.05.2009
comment
+1 за это. Не думал об этом так ясно, пока не увидел ту фотографию. Это также могут быть отдельные команды и т. Д., Где одна команда объединяет работу других. (То есть самым низким подразделением может быть команда, а не отдельный разработчик, если все они хорошо себя ведут.) - person Macke; 11.10.2009
comment
Так как же заставить кого-нибудь согласиться быть менеджером по интеграции? - person Ian Ringrose; 17.01.2012

Я несколько лет работал с командой Glasgow Haskell Compiler, используя Darcs. Недавно (несколько месяцев) я начал использовать git для своей собственной копии репо, как для повышения производительности, так и для улучшения моего образования.

  1. Как вы справляетесь с N-образным слиянием?

    Нет N-сторонних слияний. Каждый разработчик создает поток исправлений, и потоки объединяются по одному в каждом репо. Таким образом, если N разработчиков вносят изменения одновременно, они объединяются попарно.

  2. Используете ли вы единый центральный авторитетный репозиторий?

    Абсолютно. Это единственный способ узнать, что такое GHC, а что нет.

  3. Часто ли разработчики отправляют и извлекают код друг от друга или все идет через центральный репозиторий?

    Я думаю, это зависит от разработчиков и используемой вами системы контроля версий. В проекте GHC почти все изменения, которые я вижу, проходят через центральный репозиторий. Но есть тяжеловесный (самоуправляемый) привратник, отправляющий запросы к центральному репо, и если у моего коллеги есть исправление ошибки, которое мне нужно сейчас, я извлечу его прямо из его репо. С darcs очень легко вытащить только один патч (а не все состояние, как в git), и я знаю, что мои коллеги-разработчики, у которых больше опыта работы с darcs, используют эту функцию намного больше, чем я --- и им это очень нравится.

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

person Norman Ramsey    schedule 25.04.2009

Достаточно известный «Tech Talk: Линус Торвальдс на git» объясняет, как он используется для Linux (примерно такая большая команда, как я могу себе представить)

Если я правильно помню, его использование сравнивалось с военной цепочкой командования - у каждого модуля есть сопровождающий, который обрабатывает запросы на извлечение от разработчиков, затем есть несколько «самых доверенных» людей, которые занимаются извлечением данных от разработчиков модуля в официальный репозиторий kernel.org git.

"Linux: Управление исходным кодом ядра с помощью 'git'" также объясняет это, хотя опять же, это вряд ли кратко. объяснение..

person dbr    schedule 25.04.2009

Вот один пример (отнюдь не «универсальный»)

У нас есть центральная система контроля версий (ClearCase или SubVersion, в зависимости от различных проектов), и мы используем их для «официальных» разработок (разработка, патчи, исправления), где количество веток ограничено и четко обозначено.

Однако для рефакторинга разработок, включающих множество промежуточных состояний, где ничего не работает и где многим разработчикам требуется собственная ветвь на основе действий или ветки, некоторые репозитории Git создаются между этими разработчиками в метод P2P.
Как только работа достигает некоторой стабильности 0.1 и количество слияний сокращается, она повторно импортируется в VCS, где работа может продолжаться "упорядоченно" из центра.

Поскольку Git в Windows работает хорошо (MSysGit), мы управляем чтобы таким образом можно было быстро выполнить небольшие начальные разработки на стороне.

Тем не менее, мы все еще оцениваем Git для полномасштабной разработки проекта.

person VonC    schedule 24.04.2009
comment
Я обнаружил, что поддержка Git в Windows довольно плохая, IMO. MSysGit, похоже, обеспечивает хорошую основу, но тот факт, что все он построен на MinGW (и исторически запускался только в CygWin), немного отстой. TortoiseGit (code.google.com/p/tortoisegit) неплохо помогает, но это все еще бета (возможно, даже альфа). - person alastairs; 26.04.2009
comment
Почти три года спустя я хочу сказать, что MSysGit прошел долгий путь, и для разработчиков Visual Studio нет ничего лучше, чем плагин GitExtensions. - person Justin ᚅᚔᚈᚄᚒᚔ; 04.02.2012
comment
@Justin ᚅᚔᚈᚄᚒᚔ: Я согласен, как я подробно описал в http://stackoverflow.com/questions/1346031/is-perforce-worth-it/1346196#1346196 с обновлением за ноябрь 2011 г. моего ответа от 2009 г. - person VonC; 04.02.2012

Вероятно, лучше всего посмотреть, как работают разработчики ядра Linux. У них довольно сложный рабочий процесс, когда изменения отправляются из многих источников, а затем доверенные разработчики для каждой подсистемы (называемые лейтенантами) втягивают изменения и, когда они довольны, отправляют их Линусу, который в конечном итоге либо втягивает их в свое дерево, либо отвергает их. Конечно, это более сложно, но это общий обзор.

person David Plumpton    schedule 25.04.2009