2016-10-29 16 views
2

ここでは、私が長い間戸惑ってしまっているのは、私がうまく普遍的な解決策を見つけることができないためです。gitを使用したブランチ固有の構成ファイルのメンテナンス

利用可能な2本のgitの枝、productiondevがあるとしましょう。それぞれは、いくつかのタスク(すなわち、資格証明、ビルドパス、テスト/配備スクリプトの切り替えなど)のための独自の設定可能なパラメータを使用します。同じ時刻の実装スクリプト&のコードは両方のブランチで共通です。

ここで、問題は、gitリポジトリ内のブランチ固有の設定を必要な方法で維持する方法です。そこに共通の解決策の一つは、シンボリックリンクや特定のブランチのためのコンクリートを無視して、

$ cat .gitignore | grep conf 
/concrete.conf 
$ ls -l *.conf 
lrwxrwxrwx 1 1000 100 12 Oct 29 10:23 concrete.conf -> generic.conf 
-rw-r--r-- 1 1000 100 0 Oct 29 10:16 generic.conf 

破壊のようにして、次の開発ボックスにconcrete.confを調整し、gitの中に「テンプレート」の設定ファイルを使用することです。しかし、私が追求している解決策ではありません。

私の要件は(OK、を希望する)です:Gitのブランチあたり

  • サポート個別の設定ファイル、および
  • はgitの同じ時間で管理されるブランチ固有の設定ファイルを保つ

それも可能ですか? (実際には、他のファイルがソースになっていることが好ましいが、関連性がない...)

これまでのところ、マージ後のフックを使用してブランチごとの設定それ自体はgitによって無視されている他のソースからのですが、最初から悪臭を放っています。

問題の解決方法についてのご意見はありますか?

PS:* nixの固有の提案(すなわち、シンボリックリンク/ハードリンクを使用して)の提案は、私はM $に興味はそれが可能であり、かつシンボリックリンクを含まない

答えて

2

をターゲットにしなければならないのか、絶対に大丈夫です。

あなたが次にないバージョンmy.configが、テンプレートファイルmy.config.tpl、及び(各支店の値を持つ)値ファイル

prod.conf 
dev.conf 

を行い、あなたは.gitattributes declarationを使用して、content filter driverを使用することができます。

スクリプト

smudge (「Pro Git book」から「Customizing Git - Git Attributes」からの画像は、)<branch.conf>ファイルの値でプレースホルダの値を置き換えることにより、my.configファイルを生成し、それぞれの時間は、あなたはブランチをチェックアウト。
はあなたが現在のブランチ名について知ることができます。

branch=$(git rev-parse --symbolic --abbrev-ref HEAD) 

生成された実際のmy.configは(.gitignoreで)無視されたままになります。
これは、実際の作業ツリーが「ダーティ」にならないことを意味します。

汚れスクリプトは、正しい値のファイルを選択し、が汚れスクリプトはgit checkout中に適用されるテンプレートに基づく正しいweb.configを生成します。

git smudge/clean filter between branches」の完全な例を参照してください。

+0

ありがとうございます、これは一目瞭然です。私はあなたの答えを受け入れる前にそれをしばらく噛んで消化する必要があります。 – agg3l

+0

それは自然にコミット/チェックアウト/ etcフックを伴います。私も自分自身を見ていた方向。いくつかのフックを使用せずに解決策がないと思います。問題についての論理的な結果は、 – agg3l

+0

で書かれています。@フックは正確ではありませんが、 '.gitattributes'スマッシュスクリプトの宣言を有効にするにはローカル設定が必要です。 – VonC