Я начинаю новый проект и пытаюсь решить, как организовать код в Bitbucket. Я работаю в стартапе, где у всех нас есть технический опыт, но никто из нас не работал в компаниях по разработке программного обеспечения. Мы спорили о наилучшем способе организации нашего кода в наших репозиториях bitbucket.
У нас есть некоторый PHP-код для интерфейса нашего веб-сайта, а некоторые Matlab для бэкэнда (Matlab выполняется для работы с PHP, но я не думаю, что это актуально). Код PHP используется исключительно для веб-сайта, но многие разработчики Matlab работают над изменениями, некоторые из которых имеют отношение к веб-сайту, а некоторые нет.
Мы разработали три схемы организации кода:
Схема 1: Поместите Matlab и PHP в один и тот же репозиторий. Разделите Matlab на "Веб-сайт" (основной филиал a.k.a.), "Develop1", "Develop2" и т.д. Разработчики работают в своем собственном филиале, и периодически мы объединяем ветки разработки в ветку сайта.
Схема 2: Поместите Matlab и PHP в один и тот же репозиторий. Разработчики, которые хотят работать над Matlab, разворачивают Matlab в другие репозитории, затем представляют запросы на загрузку, когда хотят, чтобы их код сливался с кодом Matlab веб-сайта.
Схема 3: Поместите PHP в один репозиторий, а Matlab - в другой. Затем разработчики fork или branch, как описано выше.
Каковы ваши мысли? DBA в нашей компании говорит, что это ужасная идея поместить два типа кода в один и тот же репозиторий (и в какой-то момент это будет три, поскольку мы будем замедлять изменение кода Matlab на C или какой-либо другой язык), С другой стороны, я беспокоюсь, что будет сложно отслеживать, какие версии работают друг с другом для PHP и Matlab, если они находятся в отдельных хранилищах.
Я прочитал несколько сообщений о переполнении стека, которые частично ответили на мои вопросы:
Это помогло мне понять разницу между ветвями и вилками - мне кажется, что ветки просто требуют большего доверия к разработчикам, поскольку они могут объединиться без разрешения или обзора кода.
git ветвь, fork, fetch, merge, rebase и clone, каковы различия?
Это кажется очень близким к моему вопросу, хотя, когда я показал его администратору баз данных, он сказал, что это не очень хороший пример, поскольку Java и Javascript настолько похожи. Однако ответ, написанный здесь, кажется, указывает на мою схему 1.
Как организовать общий код/активы по проектам с репозиториями git
Это также помогло мне лучше понять ветки и git.
http://tom.preston-werner.com/2009/05/19/the-git-parable.html
Этот ответ также предполагает, что даже код, который не имеет общих файлов, должен находиться в том же репозитории, если он является частью одного и того же проекта.
Используйте только один репозиторий. Нет абсолютно никаких оснований делать два репозитория только из-за языков. Большинство проектов используют в любом случае несколько языков (например, веб-приложение будет иметь некоторую часть сервера, например Java или Go, некоторые файлы HTML, CSS и JavaScript, несколько сценариев оболочки, некоторые скрипты SQL, несколько используемых утилит и т.д.). Используйте два репозитория только в том случае, если вы можете использовать один без другого в некотором роде, и вы указали чистый интерфейс между ними (в этом случае было бы полезно создать два репозитория, но это явно не ваш случай). Ваша забота правильна: синхронизация отдельных репозиториев - это кошмар.
И ветки вообще не используются для разделения языков. Они используются, чтобы позволить вам иметь разные версии всего вашего кода (разрабатывая новую функцию, сохраняя выпущенную версию, чтобы вы могли вернуться к ней для исправления, имея выделенную лучшую тестовую ветвь для производства и т.д.).
Обратите внимание, что вы можете иметь клоны репозитория (помните: git), вы даже можете решить, что существует один репозиторий, на котором только несколько поддерживающих пользователей имеют доступ на запись, и они извлекают из других репозиториев. Но в этот момент, с вашим опытом, вы можете использовать решение, построенное поверх git, а не чистое базовое git, будь то коммерческое (смотрите Atlassian, GitHub и т.д.) Или бесплатно (например, гитолит).