61191


現在、Gitで実装中のソフトを複数環境で運用したいと考えております。その際、環境毎にデータの保存先や参照するパスの情報が変わって来るので、Gitの管理対象からは外して運用したいと考えています。

この場合、.gitignoreにそのファイルを加えてしまうと、ファイル自体が消えてしまったのですが、今までのコミットの情報は残しつつ、今後のGitの管理からはそのファイルを管理対象から外すという事は出来ないのでしょうか？


CC BY-SA 4.0
2019-12-06T11:53:59.287
61173
2019-12-07T02:33:03.550
19869
question
git
Gitで環境毎の設定ファイルだけ、途中から管理対象外(ファイルを残す)とする方法


以下の通り `--cached` オプションを付けて `git rm` を実行してみてください。

[code]

    $ git rm --cached FILE
    
[/code]


CC BY-SA 4.0
2019-12-06T12:16:23.713
61175
2019-12-06T12:16:23.713
3060
61173
answer


> 今までのコミットの情報は残しつつ、今後のGitの管理からはそのファイルを管理対象から外すという事は出来ないのでしょうか？

`git rm --cached FILE`  
コミットすると、リポジトリの中の 設定ファイルを消すことになります。  
開発者がコミットしつつ 設定変更する用途には利用できません。

`git update-index --assume-unchanged [ファイル名]`  
`git update-index --skip-worktree [ファイル名]`  
どちらも 開発者が 自分の修正を間違ってコミットしないように 変更の追跡を逃れる目的で利用します。  
開発者が 各自の作業ディレクトリで このコマンドを実施する必要があります。  
中央のリポジトリで 設定ファイルが変更された場合、その設定を 自分の環境に上書きするか？  
無視するかの違いによって この２つのコマンドを使い分けます。

の案がありますが、おそらく どちらも 目的通りには動作しないと思います。  
git 初心者が 開発者の中にいると間違ってコミットする・・という事が良くおきます。

### 根本的な解決

環境定義を読み込む部分で、複数のファイルから値を読み込むような工夫が必要だと思います。

１）すべての環境で共通の設定が入った物：ソース管理する。  
２）開発時の設定によって設定が変わる物：開発版、リリース版で違う定義にする。ソース管理する。  
３）個人の開発環境によって設定が違うもの：ひな形だけソース管理する。  
各個人は ソース管理外のフォルダにおいて自由に変更して利用する。

これらの設定をアプリが読み込むようにアプリ側で工夫をします。

`dotnet Core` であれば ユーザーシークレット と言って 環境に依存する設定は  
複数の設定ファイルや、環境変数から読み込んでその値を利用するようになっています。

`.NET Framework` の場合にはビルド時に app.config web.config ファイルを  
リリース用、開発用に 分けてビルドできます。  
開発用の時に 外部の user.config ファイルを ソース管理外のフォルダにおいて  
その値を参照する事ができます。

今までの失敗した経験上 git の設定では 限界があると思います。  
間違ってコミットしたり、リリースした時に設定ファイルを上書きしたり・・。

お使いの言語で 複数の環境から値を取得して開発するような仕組みが用意されていないか  
確認する事をお勧めします。


CC BY-SA 4.0
2019-12-07T02:33:03.550
61191
2019-12-07T02:33:03.550
18851
61173
answer