2012-12-13 50 views
13

我有一個網站,我保持在混帳。 這是一個asp.net webforms網站(但這可能對這個問題並不重要)。git與多個網站的結構

該網站被我們的客戶用於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 

將一個很好的結構,這是什麼混帳的簡化版本?

例如BackOffice代碼將被完全共享。 除Styles文件夾和web.config文件外,網站將被共享。

對於不會合並和分支過長頭髮的結構,您有很好的建議嗎?

我曾試圖彌補,像這樣的結構:

 
Master 
|--Site1 
|--Site2 

但是從一個分支移動時的代碼到另一個 會子模塊是好的,這將複雜的事情我可以預見太多采櫻桃謬誤?

編輯: 我真的很大的問題是,我想直接從我的git倉庫部署。如果我離開這些目錄/文件,它們將在合併期間合併,除非我做了一些複雜的事情(然後我不能讓團隊中的每個人都這樣做)。 或者我將不得不忽略這些文件並從其他地方獲取它們...

回答

9

假設你的主分支包含整個項目:現在

|--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中,做到在這些分支。

現在來部署部分。假設您想部署site1,在基於主控的本地系統上創建臨時分支,將site1分支合併到其中並進行部署。最後刪除臨時分支。

git checkout -b temp 
git merge site1 

tar或壓縮您的代碼並部署它。在此之後,

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站點2, 這個腳本會做幕後的所有骯髒的工作,並給你一個tar文件,你可以部署在生產服務器上。

我希望這是有幫助的...

+0

徹底和我很想做的事情。 – akamaozu

+0

同意。比我的回答更詳細。 +1 – VonC

+0

這確實是最好的解決方案 – khebbie

6

A submodule是共享BackOffice代碼的一個很好的解決方案,每個站點都充當父級回購站。

但是這並沒有解決配置文件。

對於這些,一種可能性是content filter,但這涉及到存儲和推送不同客戶端的變量值。

最好將這些配置文件保存在特定於客戶端的分支中的父回購。

+0

這真的是最'git'-idiomatic解決方案。答案是他們所有人手中最少的,但這是最佳實踐解決方案。 –

2

我可能會單獨的「網站」和「公共」目錄中,以「共同」的關鍵點處包含符號鏈接和一個或兩個子模塊,像這樣:

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 

越看越越我像最後一個更好。