web-dev-qa-db-ja.com

バイナリファイルをSCMにチェックインすることに反対する議論

私は主にJavaアプリケーションを構築する会社で働いており、バイナリファイル(依存関係と最終製品)をSCMにチェックインするのをやめるようにみんなを説得しようとしています。

彼らはそれが悪い習慣であることを知っていますが、彼らは「それはうまくいく」と考えており、多くの人がMavenやAnt以外の構築ツールについて知っていても実際には問題ではありません。 PMとプログラマー(約50人)の両方が反対意見に耳を傾け、それがバックアップスペースの無駄であることを認める準備ができていますが、習慣の変更には多大な労力が必要になるため、私は本当に説得力があります。変更をサポートするためにどのような議論を使用しますか?

編集:さて、依存関係のようにほとんど変更されないファイルと生成されたファイルを区別することは理にかなっています。それでも、私は後者に対する理由に興味があります。

10
Ither

ストレージスペースは安価であるため、ファイルをチェックインする必要がある理由とチェックインすべきでない理由については、あまり説得力のある議論ではありません。

代わりに、SCMの目的にアピールすることができます。 SCMによって追跡される各ファイルは、チームが行っている並列の分散された変更を管理する必要があることを表しています。 2人のチームメンバーが同じファイルを変更しようとするまで、そのどれも実際には明らかではありません。これらの変更を解決することがSCMの真の目的であり、別の開発者の作業が誤って上書きされるのを防ぎ、できれば、これらの変更をマージするプロセスを自動化します。

マージされたバイナリファイルがどのように機能するかを一般的なマージツールが推測するための正しい方法がないため、バイナリファイルのマージは通常実際の課題です。その特定のファイルタイプを認識するように特別に設計されていない限り、ファイル内のインデックスまたはオフセットポインタがどのように機能するかについて十分に知ることはできません。

つまり、バイナリファイルを手動でマージし、ファイルがそのようにマージされたことをSCMに通知するのは開発者の責任です。それを行う開発者であるため、マージは実際には両方の以前のチェックインのすべての変更をカバーしない可能性があり、ファイルはバイナリであるため、マージを検証する自動化された方法はありません。

アートアセットなど、プロジェクトソースを実際に表すバイナリ形式の場合、これは残念ながら必要な手順です。ただし、ビルド出力はソースではありません。ソースをマージして、結果のビルド出力を再生成できるため、それらをマージする必要はありません。これらの変更の追跡と管理は100%無駄です。それほど多くはありませんが、SCMのリソースを浪費しますが、誤ったマージの失敗を乗り越えるために開発者の時間を浪費します。開発者の時間は非常に高価であり、それを無駄にするものはすべて癌です。

一方、ビルド出力をアーカイブする必要がある特定のケースがあります。これまでに出荷または展開されたプロジェクトのバージョンは、おそらく無期限に保持する必要があります。顧客が問題を抱えている実際のビルドの正確なバイト単位のコピーがあると、顧客の正確なバージョンが得られるため、顧客のサポートがはるかに簡単になります。

そのバックアップは、通常、異なるスケジュールに従い、基本的に異なる構造を持つため、ソースコードと同じリポジトリにあるべきではありません。

依存関係は、バイナリ形式であっても、他の誰かがプロジェクトをプルダウンしたときに正しく機能するようにチェックインする必要があります。主な関心事はファイルの種類ではなく、ファイルがどのように作成されるかです。私が使用する経験則では、別のファイルを使用して生成できる場合、チェックインされません。これは、自動生成されたドキュメント、私が作成したバイナリファイルなどを意味します。

10
Thomas Owens

SCMを使用する主な利点の1つは、過去のいつからでもシステムを再構築できることです。したがって、リビジョン番号を確認してビルドするだけなので、最終ビルドをSCMに保存しても意味がありません。

依存関係について言及します... SCMは、新しいマシン(開発環境を使用)にクリーンチェックアウトを実行し、ビルドを押して、他に何もインストールせずにシステムをビルドできるように設定する必要があります。したがって、SCMでバイナリの依存関係を維持することをお勧めします。ライブラリはめったに変更されないため、多くのスペースを占有しません。

ほとんど誰もこれをしません。

2
Henry

ソースファイルとオブジェクトファイルの両方を含めるのは冗長なようです(ソースファイルは明らかに必要です)。オブジェクトファイルは不要であるだけでなく、多くのスペースを占める可能性があります。会社が分散SCM(Git、Hg、Bzr)を使用している場合は、それらのバイナリファイルをコピーしてすべての開発者間で保存する必要があります。

0
chrisaycock