Edited at
GitDay 23

.gitignore ファイルをブランチごとに別の内容にする

More than 3 years have passed since last update.

.gitignore ファイルに限らないのですが、ブランチごとに特定のファイルの内容を変えたく、その設定をしたメモ。


前提 (困っていたこと)

Web開発で、何人かで git 使ってコード管理しています。

で、ビルド後に生成される css, js, sourcemapファイルなどを git管理に含めていると、いちいちコンフリクトが起きまくって困る!!!!

という状況でした。

(そもそもビルド後のファイルを gitに含めなくていいのでは? って話になるのですが、開発サーバへのコード反映を git でさくっとやりたくてですね……。サーバ側でビルドできればいいんだけど、環境によっては簡単にはいかず。なので、git管理にビルド後の cssファイル等も含めておきたかったのです。)


どうするか

以下の方針でなんとかできないか?


  • 普段の開発用ブランチでは、ビルド後の生成ファイルは .gitignore で無視させる → コンフリクト起きない

  • デプロイ専用のブランチを作り、そこではビルド後のファイルも git管理する → git経由でサーバに転送できる

つまり、ブランチ別に .gitignore の設定を変えられれば、なんとかならないか。


どうやったか

.gitattributes ファイルの merge=ours 設定を使いました。

まず、 .git/config ファイルに以下の設定を記述。

[merge "ours"]

name = "Keep ours merge"
driver = true

次に .gitattributes ファイルに以下のように記述。

/.gitignore merge=ours

こう設定することで、マージ時に /.gitignore ファイルはマージ対象外となり、常に自分側のファイル内容をそのまま残すようになります。

つまり、ブランチごとに .gitignore の内容を別にすることができる!


こうなった

結果、作業はこんな流れに。


  • 開発ブランチではビルド後の生成ファイルは .gitignore で無視。(もちろんコンフリクトは起きない)

  • デプロイ時は、デプロイ用ブランチに内容をマージ。

  • デプロイ用ブランチでは .gitignore の内容を変えており、ビルド後のファイルは無視されない。なので add して commit する。

  • その内容を開発サーバにデプロイ。


以上

いまのところ、この方法でなんとかしています。

(もっと上手いやりかたあれば教えてください)

また、この merge=ours を使った方法は、やむを得ず環境設定ファイル等を git管理に含めないといけない & ブランチ毎に設定ファイルの内容を変えないといけない、という場合にも使えると思います。


参考