Подтвердить что ты не робот

Структура в git с несколькими веб-сайтами

У меня есть веб-сайт, который я храню в git. Это веб-сайт asp.net webforms (но это, вероятно, не имеет значения для этого вопроса).

Веб-сайт используется нашим клиентом для 2 (в будущем 4) веб-сайтов. Большая часть функциональных возможностей используется совместно. Но некоторые вещи, такие как web.config и папка с css, уникальны для каждого веб-сайта.

Вот упрощенная версия кода

|--BackOffice
|  \--UI
|--BackOffice.UI
|  \--WebControls
|--BackOfficeTests
|--Deployment
|  \--db
|--BusinessLogicLayer
|  |--bin
|  |--obj
|  \--Properties
|--scripts
|--Website
|  |--admin
|  |--App_Browsers
|  |--App_Code
|  |--App_Data
|  |--Styles
|  |--web.config

Какова была бы хорошая структура для этого в Git?

Например, код BackOffice будет полностью разделен. Веб-сайт будет доступен, за исключением папки "Стили" и файла web.config.

Есть ли у вас хорошее предложение для структуры, которая не делает слияние и ветвление слишком длинным?

Я попытался создать такую ​​структуру:

Master
|--Site1
|--Site2

Но я предвижу слишком много черрипика при перемещении кода из одной ветки в другую Будет ли подмодуль в порядке или это усложнит ситуацию?

EDIT: Моя действительно большая проблема заключается в том, что я хочу развертывать непосредственно из своего репозитория git. И если я уйду в эти каталоги/файлы, они будут объединены во время слияния, если я не сделаю некоторые сложные вещи (тогда я не могу позволить всем в команде сделать это). Или мне придется игнорировать эти файлы и получать их откуда-то еще...

4b9b3361

Ответ 1

Предполагая, что ваша главная ветвь содержит весь ваш проект:

|--BackOffice
|  \--UI
|--BackOffice.UI
|  \--WebControls
|--BackOfficeTests
|--Deployment
|  \--db
|--BusinessLogicLayer
|  |--bin
|  |--obj
|  \--Properties
|--scripts
|--Website
|  |--admin
|  |--App_Browsers
|  |--App_Code
|  |--App_Data
|  |--Styles
|  |--web.config

Теперь любые изменения, которые являются общими для всех веб-сайтов, привязаны к этой ветке.

Сделайте отдельные ветки для разных сайтов. Пример:

От ведущей ветки

git checkout -b site1
git checkout -b site2
git checkout -b site3
git checkout -b site4

теперь, когда вы хотите изменить какие-либо файлы определенного сайта, то есть папку "Стили" или web.config, сделайте это в этих ветвях.

Теперь идет часть развертывания. Предположим, вы хотите развернуть сайт1, создать временную ветвь в локальной системе на основе мастера, объединить в нее ветвь site1 и развернуть ее. Наконец, удалите ветвь temp.

git checkout -b temp
git merge site1

tar или запишите свой код и разверните его. После этого

git checkout master
git branch -D temp

Вы даже можете сделать небольшую оболочку script, которая делает это, если вы не хотите раскрывать способ развертывания. Позволяет называть это script deploy.sh. Например:

#!/bin/bash

if [ ! $1 ]; then
        echo "Please pass in the name of the site you want to deploy."
        exit 1
fi

#Check if we are on master branch
git status | grep "On branch master"
if [ $? -ne 0 ]; then
        echo "You are not on master. Please execute 'git checkout master'"
        exit 1
fi

#Check if the entered site for deployment actually exists
git branch | grep $1 || { echo "No branch $1 exists for deployment."; exit 1; }

#Update from remote
git checkout -b temp
git merge $1
tar -cvf deploy-$1.tar ./deploy.sh *
[ $? -ne 0 ] && echo "Some problem archiving the files..." && exit 1
git checkout master
git branch -D temp

echo "Please use deploy-$1.tar file to deploy the site. Thanks."

exit 0

Теперь, когда вы говорите. /deploy.sh site2, этот script сделает всю грязную работу за кулисами и предоставит вам tar файл, который можно развернуть на рабочем сервере.

Надеюсь, это полезно...

Ответ 2

A submodule является хорошим решением для общего кода BackOffice, причем каждый сайт выступает в роли родительского репо.

Но это не касается файлов конфигурации.

Для них одна из возможностей - контент-фильтр, но это касается хранения и нажатия значений переменной для разных клиентов.

Лучше всего сохранить эти файлы конфигурации в родительском репо в ветвях, специфичных для клиента.

Ответ 3

Я могу сделать отдельные каталоги "Сайт" и "Общие", с "Общими", содержащими символические ссылки в стратегических точках и один или оба подмодуля, например:

 Project
 |==.git
 |--Site
 |  |--.git
 |  \--Website
 |     |--Styles
 |     \--web.config
 \--Common
    |--.git
    |--BackOffice
    |  \--UI
    |--BackOffice.UI
    |  \--WebControls
    |--BackOfficeTests
    |--Deployment
    |  \--db
    |--BusinessLogicLayer
    |  |--bin
    |  |--obj
    |  \--Properties
    |--scripts
    \--Website
       |--admin
       |--App_Browsers
       |--App_Code
       |--App_Data
       |--Styles -> ../../Site/Website/Styles
       \--web.config -> ../../Site/Website/web.config

Это не единственный макет, который будет служить - например, если будет легко иметь разные сайты, выбрать и выбрать, что будет изменено, вы можете сохранить свой текущий макет, добавив подпроект "Common" и символически связав все, что вы используете из он не изменился, так:

 Site
 |==.git
 |--BackOffice -> Common/BackOffice
 |--BackOffice.UI -> Common/BackOffice.UI
 |--BackOfficeTests -> Common/BackOfficeTests
 |  [...]
 |--Website
 |  |--admin -> ../Common/Website/admin
 |  |--App_Browsers -> ../Common/Website/App_Browsers
 |  [...]
 |  |--Styles
 |  \--web.config
 \--Common
    |--.git
    |--BackOffice
    |  \--UI
    |--BackOffice.UI
    |  \--WebControls
    |--BackOfficeTests
    |--Deployment
    |  \--db
    |--BusinessLogicLayer
    |  |--bin
    |  |--obj
    |  \--Properties
    |--scripts
    \--Website
       |--admin
       |--App_Browsers
       |--App_Code
       |--App_Data
       |--Styles.example
       \--web.config.example

Чем больше я смотрю на него, тем больше мне нравится, что последнее лучше.