ページの上部にいくつかの単純な変数を含む短いスクリプトを書いています。私は友人と一緒にそれらに取り組みたいのですが、私たちの一人のために毎回プルした後に変更する必要がある変数を管理し、不要なジャンクをgitステータスに追加する方法がわかりません。私たちはそれぞれに異なる名前付きブランチを作成することを考えました。その後、マスターはユーザー名の例を設定するだけですが、余分な作業をすべてマージしなければならないのは馬鹿げているようです。変数をオプションとしてスクリプトに渡すこともできますが、これは望ましくなく、別の構成ファイルに分離することもできません。 .gitignoreのようなものがあると便利ですが、ファイル内の数行のみを無視します。
これをエレガントに管理するにはどうすればよいですか?この問題は通常どのように管理されますか?
ファイルの特定の行に対する変更を単に無視することは簡単にはできません。恐らく、別の構成ファイルを持つことに行き詰まっているでしょう。以下に、これに対処するための2つの典型的な方法と、もう少しエキゾチックな方法をリストしました。
ここでは、例としてファイルconfig.sample
をgitに保持しますが、アプリケーションは実際には.gitignore
にあるファイルconfig
の値を使用します。 config
が存在しない場合、アプリケーションはエラーを生成します。個人用config
ファイルに新しい構成変数を追加するときは、サンプルファイルの値を変更することを忘れないでください。この場合、サンプルの変更後に誰かがconfig
ファイルを更新し忘れた場合に備えて、必要なすべての構成変数が実際に設定されていることをアプリケーションで確認することもお勧めします。
config.defaults
というファイルをgitに保存します。このファイルには、可能な限り適切なデフォルトの構成値があります。アプリケーションは、最初にconfig.defaults
から、次にconfig
(.gitignore
にある)から構成を取得して、デフォルト値のいずれかを上書きする可能性があります。この方法を使用すると、通常、config
が存在しなくてもエラーになりません。そのため、config
の作成を気にしていない人がアプリケーションをすぐに使用できます。
この場合、個人的にはお勧めしない3番目の可能性は、gitでコミットされる単一の構成ファイルを使用することですが、git update-index --assume-unchanged <FILE>
を使用して、gitに変更を無視するように指示します。 (これについては この便利なブログ投稿 で詳しく説明します)。つまり、ローカルでの構成ファイルへの変更はgit commit -a
でコミットされず、git status
にも表示されません。
Python/Django固有のソリューションは、リポジトリにチェックインされる共有settings.py
ファイルと、settings_local.py
の最後にインポートされるローカルsettings.py
を使用することです。マシン固有の値。
私の場合、チームの他のすべての開発者がそうであるように、別の(小さな)ファイルに "config"変数があります。私のデータベースの場所などのものが保管されています。このファイルの名前を.gitignore
これはバージョン管理されないようにするためですが、「sample_config」ファイルをチェックインして、新規参入者がコピーを作成して自分の目的で使用できるようにします。
その他のオプション(エレガントではありませんが役立つ場合があります):
git stash
とgit stash pop
を使用してくださいgit checkout config <your config file>
を使用します2番目のオプションは、ローカル構成の変更をリポジトリ(どこかに)に保持する必要がある場合に適しています。
最近では、たとえば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')
このような短いスクリプトがいくつかあり、個別の構成ファイルを作成する代わりに、個別のsetenv.sh(またはsetenv.bat)ファイルを作成します。いくつかの単純な変数をこの新しいファイルに移動し、メインスクリプトでsetenv.shファイルを呼び出します。ユーザーごとに変更されない変数は、メインスクリプトに残ります。このsetenv.shスクリプトのサイズに応じて、このsetenv.shの作成方法に関するドキュメントを作成するか、テンプレートとして使用するsetenv.sh.sampleをコミットします。
これのバリエーションは、setenv.shを作成したり呼び出したりせず、ユーザーがメインスクリプトで使用される環境変数を設定できるようにすることです。変数が存在しない場合、メインスクリプトは文句を言うでしょう。
一部の短いスクリプトは、大きなスクリプトに成長したり、本格的なアプリケーションになったりします。これが起こったとき、私は構成ファイルの方法を使います。 http://www.configapp.com に、Configという構成ファイルを管理するアプリケーションがあります。構成には、環境とインスタンスの概念があります。この例では、1つのローカル環境と2つのインスタンスがあります。共通変数はローカル環境に入り、マシン固有の変数(あなたとあなたの友人)はインスタンスに入ります。これは小さなスクリプトには少し多すぎますが、アプリケーションには適しています。