.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管理に含めないといけない & ブランチ毎に設定ファイルの内容を変えないといけない、という場合にも使えると思います。