在使用git管理多个网站时的结构

13

我有一个网站,它存在于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代码将完全共享。Website将被共享,除了Styles文件夹和web.config文件。

你有没有一个好的建议,可以避免合并和分支过于复杂?

我曾试图创建如下结构:

Master
|--Site1
|--Site2

但我预见到会有太多的挑选代码从一个分支移到另一个分支。使用子模块行不行,或者会让事情变得更加复杂?

编辑: 我的一个真正大的问题是,我想直接从我的git存储库部署。如果我留下这些目录/文件,它们将在合并期间被合并,除非我做一些复杂的事情(那时我不能让团队中的每个人都这样做)。 否则我将不得不忽略这些文件,并从其他地方获取它们...

3个回答

11
假设您的主分支包含整个项目:
|--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

现在,每当您想要更改任何特定网站文件,例如Styles文件夹或web.config,请在这些分支中进行更改。

现在是部署部分。假设您想要部署site1,请在本地系统上基于主分支创建一个临时分支,将site1分支合并到其中并部署它。最后删除临时分支。

git checkout -b temp
git merge site1

打包您的代码成 tar 或 zip 格式并部署。之后,

git checkout master
git branch -D temp

如果您不想公开部署方式,甚至可以编写一个小的Shell脚本来完成此操作。我们将其称为 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时,这个脚本将在幕后完成所有繁琐的工作,并给你一个tar文件,你可以将其部署到生产服务器上。

希望这有所帮助...


彻底而且基本上就是我会做的。 - akamaozu
同意。比我的回答更详细。+1 - VonC
这绝对是迄今为止最好的解决方案。 - khebbie

6
一个子模块是共享BackOffice代码的好解决方案,每个站点都充当父仓库。
但这并不能解决配置文件的问题。
对于这些文件,一种可能的解决方案是内容过滤器,但这将涉及存储和推送不同客户端变量的值。
最好将这些配置文件保留在父仓库中的特定于客户端的分支中。

这确实是最符合 git 习惯的解决方案。虽然它不太容易理解,但却是最佳实践的解决方案。 - New Alexandria

2

我可能会创建独立的“Site”和“Common”目录,其中“Common”包含在关键点处的符号链接和一个或两个子模块,如下所示:

 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

我越看越喜欢最后一个。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接