web-dev-qa-db-ja.com

コラボレーション時に構成ファイルを管理するにはどうすればよいですか?

ページの上部にいくつかの単純な変数を含む短いスクリプトを書いています。私は友人と一緒にそれらに取り組みたいのですが、私たちの一人のために毎回プルした後に変更する必要がある変数を管理し、不要なジャンクをgitステータスに追加する方法がわかりません。私たちはそれぞれに異なる名前付きブランチを作成することを考えました。その後、マスターはユーザー名の例を設定するだけですが、余分な作業をすべてマージしなければならないのは馬鹿げているようです。変数をオプションとしてスクリプトに渡すこともできますが、これは望ましくなく、別の構成ファイルに分離することもできません。 .gitignoreのようなものがあると便利ですが、ファイル内の数行のみを無視します。

これをエレガントに管理するにはどうすればよいですか?この問題は通常どのように管理されますか?

56
Gitter

ファイルの特定の行に対する変更を単に無視することは簡単にはできません。恐らく、別の構成ファイルを持つことに行き詰まっているでしょう。以下に、これに対処するための2つの典型的な方法と、もう少しエキゾチックな方法をリストしました。

Gitにサンプル構成ファイルがある

ここでは、例としてファイルconfig.sampleをgitに保持しますが、アプリケーションは実際には.gitignoreにあるファイルconfigの値を使用します。 configが存在しない場合、アプリケーションはエラーを生成します。個人用configファイルに新しい構成変数を追加するときは、サンプルファイルの値を変更することを忘れないでください。この場合、サンプルの変更後に誰かがconfigファイルを更新し忘れた場合に備えて、必要なすべての構成変数が実際に設定されていることをアプリケーションで確認することもお勧めします。

Gitにデフォルト値のファイルがある

config.defaultsというファイルをgitに保存します。このファイルには、可能な限り適切なデフォルトの構成値があります。アプリケーションは、最初にconfig.defaultsから、次にconfig.gitignoreにある)から構成を取得して、デフォルト値のいずれかを上書きする可能性があります。この方法を使用すると、通常、configが存在しなくてもエラーになりません。そのため、configの作成を気にしていない人がアプリケーションをすぐに使用できます。

--assume-unchangedで単一の構成ファイルを使用する

この場合、個人的にはお勧めしない3番目の可能性は、gitでコミットされる単一の構成ファイルを使用することですが、git update-index --assume-unchanged <FILE>を使用して、gitに変更を無視するように指示します。 (これについては この便利なブログ投稿 で詳しく説明します)。つまり、ローカルでの構成ファイルへの変更はgit commit -aでコミットされず、git statusにも表示されません。

60
Mark Longair

Python/Django固有のソリューションは、リポジトリにチェックインされる共有settings.pyファイルと、settings_local.pyの最後にインポートされるローカルsettings.pyを使用することです。マシン固有の値。

5

私の場合、チームの他のすべての開発者がそうであるように、別の(小さな)ファイルに "config"変数があります。私のデータベースの場所などのものが保管されています。このファイルの名前を.gitignoreこれはバージョン管理されないようにするためですが、「sample_config」ファイルをチェックインして、新規参入者がコピーを作成して自分の目的で使用できるようにします。

4
Noufal Ibrahim

その他のオプション(エレガントではありませんが役立つ場合があります):

  • 設定ファイルにはgit stashgit stash popを使用してください
  • たとえば、ローカル構成ファイルが変更されたconfigという名前のブランチを作成し、git checkout config <your config file>を使用します

2番目のオプションは、ローカル構成の変更をリポジトリ(どこかに)に保持する必要がある場合に適しています。

2
Mick Kelly

最近では、たとえばpython/DjangoでENV変数を使用していますが、それらにデフォルトを追加することもできます。 dockerのコンテキストでは、ENV変数をdocker-compose.ymlファイルまたはバージョン管理で無視される追加のファイルに保存できます。

# settings.py
import os
DEBUG = os.getenv('Django_DEBUG') == 'True'
EMAIL_Host = os.environ.get('Django_EMAIL_Host', 'localhost')
0
yvess

このような短いスクリプトがいくつかあり、個別の構成ファイルを作成する代わりに、個別のsetenv.sh(またはsetenv.bat)ファイルを作成します。いくつかの単純な変数をこの新しいファイルに移動し、メインスクリプトでsetenv.shファイルを呼び出します。ユーザーごとに変更されない変数は、メインスクリプトに残ります。このsetenv.shスクリプトのサイズに応じて、このsetenv.shの作成方法に関するドキュメントを作成するか、テンプレートとして使用するsetenv.sh.sampleをコミットします。

これのバリエーションは、setenv.shを作成したり呼び出したりせず、ユーザーがメインスクリプトで使用される環境変数を設定できるようにすることです。変数が存在しない場合、メインスクリプトは文句を言うでしょう。

一部の短いスクリプトは、大きなスクリプトに成長したり、本格的なアプリケーションになったりします。これが起こったとき、私は構成ファイルの方法を使います。 http://www.configapp.com に、Configという構成ファイルを管理するアプリケーションがあります。構成には、環境とインスタンスの概念があります。この例では、1つのローカル環境と2つのインスタンスがあります。共通変数はローカル環境に入り、マシン固有の変数(あなたとあなたの友人)はインスタンスに入ります。これは小さなスクリプトには少し多すぎますが、アプリケーションには適しています。

0