1. ホーム
  2. git

[解決済み] Gitソースコントロール下のIntelliJ IDEAプロジェクトファイルが常に変化している場合の対処法は?

2022-05-04 09:06:01

質問

私たちのチームの誰もがIntelliJ IDEAを使用しており、そのプロジェクトファイル(.iprと.iml)をソース管理に置いて、ビルド構成、設定、インスペクションを共有できるようにすることは有用だと考えています。さらに、TeamCityを使用して継続的インテグレーションサーバーでこれらの検査設定を使用することができます。(ユーザーごとのワークスペース.iwsファイルは.gitignoreファイルにあり、ソースコントロールにはありません)。

しかし、これらのファイルは、IDEAであらゆることを行うと少しずつ変化していきます。IDEAの課題データベースには、それに対する課題があります( IDEA-64312 というわけで、IDEAのバグと考えることもできるかもしれませんが、当面は我慢する必要がありそうです。

最近までSubversionを使っていたのですが、最近Gitに切り替えました。私たちはそれぞれ、プロジェクトファイルの変更リストを持つことに慣れたところで、他の人と共有したいプロジェクトファイルの変更がない限りは無視し、チェックインもしませんでした。しかし、Gitの本当の力は、(私たちが探っているところでは)連続的なブランチを推奨しているようです。プロジェクト・ファイルが常に変更されている状態でブランチを切り替えるのは面倒です。多くの場合、何らかの方法で変更をマージし、プロジェクトファイルの変更が新しいブランチに適用されるように対処しようとします。しかし、新しいブランチでプロジェクトファイルが変更された場合 (たとえば、他のブランチにはまだない新しいモジュールに取り組んでいる場合など)、git は「ブランチに変更があり、自分にもローカルに変更がある場合は、ファイルをマージするのは意味がない」というエラーを投げます。コマンドラインから "-f" を使って "git checkout" を実行すれば、ローカルの変更を捨ててブランチの変更を使うように強制できますが、(1)IDEA の Git Checkout GUI コマンド (10.5.X) は、ブランチの変更をチェックアウトして、そのブランチの変更を使うように強制します。 1)にはそのようなオプションがないようです。したがって、定期的にコマンドラインに切り替える必要があります。

そこで、この問題に対処するためのオプションについて、いくつか考えてみました。

  1. プロジェクトファイルを完全にソース管理から外す。.gitignoreに入れ、他の手段で各自とTeamCityに配布します。おそらく、他の場所か他の名前でソースコントロールに入れることになるでしょう。私たちのチームは小さいので、このオプションは検討するのに十分なほど実現可能ですが、素晴らしいとは思えません。
  2. どのファイルがどのブランチにあるのか、常に管理するように心がけながら生活を続ける。その一環として、各開発者が自分のシステム上に複数のプロジェクトのコピーを持つことを奨励し、それぞれを別のブランチにチェックアウトし、おそらく異なるプロジェクトファイル群を持たせるようにしてもよいでしょう。
  3. プロジェクト(.ipr)だけをソース管理し、モジュール(.iml)ファイルはソース管理せず、.gitignore ファイルに置いてみてください。.iprの中で定期的に勝手に切り替わるのは主に共有ビルド設定の順番のようですが、その設定方法については別途情報共有すればいいのかもしれませんね。IDEAがこのような、特に新規チェックアウト時に一部のファイルしか持っていないことにどう対処するかはよく分かりませんが。

GitとIDEAの両方が持っていると思われる巨大なカスタマイズ性に対処するためでしょうか。しかし、この問題を抱えているのは私たちだけではなさそうです。Stack Overflowの似たような質問には、次のようなものがあります。 3495191 , 1000512 そして 3873872 また、私が紹介した様々なアプローチ、これらの質問に対する回答に記載されているアプローチ、あるいはお勧めのアプローチの長所と短所を、どなたか考えてみてください。

解決方法は?

IDEAの ディレクトリベースのプロジェクト構造 ここで、設定は.iprファイルの代わりに.ideaディレクトリに保存されます。これにより、より多くの きめ細かなコントロール バージョンコントロールに保存されるものに対して しかし、コードスタイルや検査プロファイルのようなものは、それぞれ.ideaディレクトリの下にある独自のファイルになるので、共有するのは簡単です。