13

我有一个网站,我保存在 git 中。这是一个 asp.net webforms 网站(但这对于这个问题可能并不重要)。

该网站被我们的客户用于 2 个(未来为 4 个)网站。大多数功能是共享的。但是像 web.config 和带有 css 的文件夹之类的一些东西对于每个网站都是独一无二的。

这是代码的简化版本

|--后台
| \--用户界面
|--BackOffice.UI
| \--Web 控件
|--BackOfficeTests
|--部署
| \ - D b
|--业务逻辑层
| |--斌
| |--对象
| \ - 特性
|--脚本
|--网站
| |--管理员
| |--App_Browsers
| |--应用程序代码
| |--应用数据
| |--款式
| |--web.config

在 Git 中有什么好的结构呢?

例如,BackOffice 代码将完全共享。除 Styles 文件夹和 web.config 文件外,网站将被共享。

对于不会使合并和分支过长的结构,您有什么好的建议吗?

我试图制作这样的结构:

掌握
|--Site1
|--Site2

但是我预见到在将代码从一个分支移动到另一个分支时会出现太多的挑剔子模块会好吗还是会使事情复杂化?

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

4

3 回答 3

10

假设您的主分支包含您的整个项目:

|--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,在本地系统上基于master创建一个临时分支,将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 文件,您可以将其部署在生产服务器上。

我希望这是有帮助的...

于 2012-12-24T03:30:57.647 回答
6

模块是共享 BackOffice 代码的一个很好的解决方案,每个站点都充当父存储库。

但这并没有解决配置文件。

对于那些,一种可能性是内容过滤器,但这将涉及为不同的客户端存储和推送变量的值。

最好将这些配置文件保存在特定于客户端的分支中的父 repo 中。

于 2012-12-13T14:36:36.163 回答
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

这不是唯一可以服务的布局 - 例如,如果应该很容易让不同的站点选择并选择调整的内容,您可以保留当前布局,添加“通用”子项目并符号链接您使用的任何内容不变,像这样:

 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

我越看越喜欢最后一张。

于 2012-12-15T16:08:07.197 回答