2012-12-13 12 views
13

私はgitのままウェブサイトを持っています。 asp.net webformsのWebサイトです(ただし、この質問にはおそらく重要ではありません)。複数のウェブサイトを持つgitの構造

このウェブサイトは、2人(将来の4人)のウェブサイトでお客様が使用しています。 ほとんどの機能は共有されています。しかしweb.configやcssのあるフォルダのようなものは、各Webサイトごとにユニークです。ここで

コード

 
|--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サイトは、Stylesフォルダとweb.configファイルを除いて共有されます。

マージや枝分かれが長すぎる構造ではないことをお勧めしますか?

私はそうのような構造を作ることを試みた:

 
Master 
|--Site1 
|--Site2 

しかし、別の に1つのブランチからコードを移動するとき、私はサブモジュールはOKだろうあまりにも多くのチェリーピッキングを予見するか、物事を複雑にしますか?

EDIT: 本当に大きな問題は、私のgit repoから直接デプロイしたいということです。そして、私がこれらのディレクトリ/ファイルに残すと、私はいくつかの複雑な作業をしない限り、マージの際にマージされます(それから私はチームの誰もがこれを行うことができません)。 または、これらのファイルを無視して別の場所から取得する必要があります。

答えて

9

masterブランチは、プロジェクト全体が含まれていることを仮定し。

さまざまなサイトに対して別々のブランチを作成します。例:今masterブランチから

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

あなたが任意のサイトの特定のすなわちスタイルはフォルダ、ファイル、またはweb.configファイルを変更したいときはいつでも、これらの枝でそれを行います。

今すぐ展開部分が来ます。 site1を配備し、masterに基づいてローカルシステムに一時ブランチを作成し、site1ブランチをそこにマージして配備したいとします。最後に、tempブランチを削除します。

git checkout -b temp 
git merge site1 

コードを圧縮して展開してください。その後、

デプロイメントのやり方を公開したくない場合は、小さなシェルスクリプトを作成することもできます。あなたが./deploy.shサイト2を言うとき、このスクリプトは、舞台裏のすべての汚い仕事をし、あなたにどのあなたができるtarファイルを与えるだろう、今

#!/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このスクリプトを呼び出すことができます運用サーバーにデプロイします。

私はこれが役に立ちそうです...

+0

徹底的に、私は何をすべきか。 – akamaozu

+0

合意。私の答えよりも詳細です。 +1 – VonC

+0

これは間違いなく最適な解決策です – khebbie

6

submoduleは、各サイトが親リポジトリとして機能する共有BackOfficeコードに適したソリューションです。

しかし、これは設定ファイルを扱っていません。

これらの場合、1つの可能性は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 

もっと見ると、もっと私は最後の方がいいよ。

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

今、すべてのウェブサイトに共通するすべての変更は、このブランチにコミットします:

関連する問題