画像をgitリポジトリに保存する必要がありますか?


201

バージョン管理としてGitとGithubを使用する分散チームの場合、画像もgitリポジトリに保存する必要がありますか?

ほとんどの場合、画像は変更されません。それらを含むフォルダーは、画像が追加されるとサイズが大きくなります。懸念事項は、大きな画像の組み合わせ、またはそれらの多くだけで、画像フォルダが時間とともに大きくなる可能性があることです。

これはベストプラクティスと見なされますか?分散チームが簡単にアクセスできるプロジェクトで必要なバイナリファイルを共有するために、他にどのような方法がありますか?


17
「画像」と言うとき、26mb DSLR Rawファイル、1mb 3dゲームテクスチャ、または<100k pngアイコンについて話していますか?(「依存する」と答えるつもりだったが、私は控える)
ブルック

2
@Brook:ウェブサイトのアイコンや小さなグラフィック要素について話していると思います。ゲームのテクスチャ、グラフィックデザインの未加工ファイル、またはドキュメント編集用の正確なグラフィックは、別の話かもしれません。
ヘイレム

6
私は個人的に、彼は写真ではなくISOイメージを意味すると思っていました。
マフムードホッサム

2
これは、実際には小/中サイズのWebに適した画像用です。心配なのは、おそらく他の何かを使うべきだと思っているときに、一部の開発者がそこにすべての大きなオリジナル画像を貼り付け始めることです。
スポンジ

6
今日この質問を読んでいますか?git lfsに関する以下の回答をご覧ください。それはおそらくあなたが望むものです。Programmers.stackexchange.com/a/306882/92506
jonnybot

回答:


188

あなたの画像は元の作品ですか、それとも他の場所から復元することができますか?ソースから構築されたソフトウェアユニットを出荷する必要がありますか?オリジナルの場合、バックアップが必要です。変更しない場合、スペースのペナルティはバックアップと同じであり、必要な場所にあります。

誤ってまたは意図的にソフトウェアの外観を変更するために編集できますか?はい-その後、それらは何らかの形でリビジョン管理される必要があります。すでに完全なソリューションがある場合は、別の方法を使用する必要があります。暗黒時代の「コピーと名前変更」バージョン管理を導入する理由

グラフィックデザイナーのMacBookハードドライブが死んだとき、プロジェクト全体の元のアートワークが「偽造」されるのを見ました。無限の知恵を持つ誰かが「バイナリは回転制御に属さない」と判断したためです。 )バックアップには向かない傾向があります。

上記の基準に適合するすべてのバイナリファイルにも同じことが当てはまります。

しない唯一の理由は、ディスク容量です。言い訳が少し薄いので、1テラバイトあたり100ドルが怖い。


44
ところで:インターネットは信頼できるソースではありません。「bobsfreestuff.com」から画像をダウンロードした場合、おそらく来週そこにはないでしょう。
マッテンツ

16
+1-そして+ moreである必要があります。バージョン管理のポイントは、あるものが何であろうと、ある時点で、あるものに回復/ロールバックできるようにすることです。すべてをバージョン管理下に置くために、その時点で想定されていたものを取り戻すことができる100%になる唯一の方法です。それはソース、画像、リソース、役立つ/サポートするPDFです。ちなみに、Zipで圧縮されたCDイメージを挿入することもあります。VM仮想マシン(VMDKを含む)をソース管理に入れることも知られています。極端なようですか?2年後にベーコンを保存しました。
すぐに

3
100%が同意します。イメージがソフトウェアの一部である場合、リビジョン管理が必要です。
ディーンハーディング

14
私が反対する唯一の理由は、開発者が実際に「これを複製するのに時間をかけたいのか、この他のブランチでXを実行できる」と考えなければならない点まで複製するのが面倒な場合です。これが発生した場合、物事が非常に迅速に再編成されることを確認してください
ブルック

5
デプロイに必要な点については+1。私が新しいチームメンバーか何かであるため、レポのクローンを作成すると、そのまま使用できます。これには、必要に応じて必要なサードパーティのライブラリを取得するのに十分な賢いmakefileが含まれます。
スペンサーラスブン

66

なぜ地獄ではないのですか?:)

バイナリを保存することは悪い習慣と見なされます、はい、しかし、私は画像についてあまり心配しません。

最悪の場合、トンがある場合は、それらを別の場所に保存するか、バイナリサポート用のエクスターナルまたは拡張機能を使用します。画像がそれほど頻繁に変更されない場合、問題はどこにありますか?あなたは大きな脂肪デルタを取得しません。そして、それらが時間の経過とともに削除された場合、履歴を保存することで少し苦しむのはあなたのサーバーだけですが、クライアントは何も見えません。

私の意見では、あなたはそれについて心配するべきではありません-あなたがそれらのGBを保存しないことを認めました。

あなたは何ができけれども行う、唯一の店「ソース」の画像です:SVGs、LaTeXのマクロ、等...とビルドシステムによって生成され、最終的なイメージがあります。可能であれば、おそらくさらに良いでしょう。そうでない場合は、気にしないでください。

(とはいえ、Gitはテキストファイルには適していますが、写真に最適なVCSではありません。可能であれば、コンテキストとメトリックを追加してください)


詳細については、次のQ&Aをご覧ください。


4
ソースを保存するために+1を使用しますが、完全なビルドなしで開発テストを実行できる場合は、混乱する可能性があります。また、午前中に作業を開始する前にすべてのイメージを構築する必要があることを意味します
-TheLQ

@TheLQ:推測しますが、多分、カスケードビルドが必要です。ダウンストリーム(テスト)ビルドは、アップストリームビルド(実際のビルド)にのみ依存できます。そして、これらをテスターがローカルで再利用するためにパブリックフォルダーにエクスポートします。それは明らかにインフラストラクチャのビットを意味しますが、それは比較的大規模なチームで物事を行う私の方法になります。
ヘイレム

バイナリとは何ですか?
ダニエルペンダーガスト14年


5
「なぜ地獄じゃないの?」-リポジトリが2GBを超えると、Bitbucket(およびGithubでも試してみた)がリポジトリを拒否するためです。そのため、大量の画像でリポジトリを肥大化させる場合は、独自のリポジトリをホストする準備をしてください。
ジェズ

48

この質問はかなり古いですが、これはGitを扱うときに出てくる一般的な質問であり、最後の回答以降、大きなファイルをGitリポジトリに保存するための最新のソリューションにいくつかの進歩があります。

Gitに大きなファイルを保存するには、次のプロジェクトがあります。

TLDR:可能であれば、git-lfsを使用してgitに画像またはその他のバイナリファイルを保存します。


9
久しぶりに、投票率の低い回答を読むためにスクロールダウンしたことを嬉しく思います。git lfsはまさに私が欲しいものであり、アトラシアンはBitBucket Serverにサポートを追加しています!これを何百万回も支持できれば、私はそうするでしょう。
jonnybot

7
@jonnybot、ありがとう。私は遅い答えでしたので、あまり可視性を得ていませんが、自分でgit-lfsを使用した後、それはgitにバイナリファイルを保存するための現在の最良のソリューションだと思います。
ジェームズマクマホン

45

「バイナリをソース管理に保存しない」全体は、特定の理由で説明されています。コンパイルするソースコードがある場合は、実際のコンパイルではなく、ソースコードのみを保存します。画像とビジュアルアセットには「ソース」がないため、バージョン管理で追跡する必要があります。


4
ビジュアルアセットには「ソースのようなもの」がある場合があり、最終出力の作成プロセスを自動化し、ソースのみをバージョン管理に保存することをお勧めします。例:SVGファイルから作成されたラスターグラフィックバージョン、スプライトシートから切り取られたWebサイトアセット。
タニウス

正しい、それは完全に公平な議論です。
ジェイソンTフェザリンガム

21

Gitで推奨される方法は、サブモジュール(Git 1.5.3で導入)を使用することだと思います。サブモジュールは、基本的にはメインモジュールに関連付けられた別個のリポジトリです。サブモジュールに画像(およびその他のバイナリアセット)を保存します。これは、必要に応じて、メインリポジトリでチェックアウトするか、そのままにしておくことができます。

http://book.git-scm.com/5_submodules.htmlから

「Gitのサブモジュールサポートにより、リポジトリにサブプロジェクトとして外部プロジェクトのチェックアウトを含めることができます。サブモジュールは独自のIDを保持します。サブモジュールサポートはサブモジュールリポジトリの場所とコミットIDを保存するだけなので、含まれるプロジェクトをクローンする他の開発者(」スーパープロジェクト」)は、すべてのサブモジュールを同じリビジョンで簡単に複製できます。スーパープロジェクトの部分的なチェックアウトが可能です。Gitにサブモジュールの一部、またはすべてを複製しないように指示できます。

また、画像が頻繁に変更されない場合、サイズは重要な問題ではありません。次のようなコマンドを実行して、サイズを整理または縮小することもできます。

git gc
git gc-aggressive
git prune

7

はい

ソフトウェアバージョン1.0をリリースするとします。バージョン2.0の場合、すべての写真を影付きに再作成することにします。そのため、これを行い、2.0をリリースします。次に、1.0を使用していて2.0にアップグレードできないお客様が、別の言語のプログラムが必要だと判断します。彼らはあなたにそれをするために1Gを与えるので、あなたは確かに言う。しかし、異なる文化では、あなたの写真の一部は意味をなさないので、それらを変更する必要があります...

ソース管理で画像を保持する場合、これは簡単です。1.0に基づいて、(特に)画像に変更を加え、ビルド、リリースします。ソース管理にこれらがない場合、古いイメージを見つけて変更し、ビルドする必要があるため、はるかに時間がかかります。


7

プロジェクトの一部である場合は、VCSに含まれている必要があります。これをどのように実現するかは、VCS、またはプロジェクトの編成方法によって異なります。たぶん、デザイナーのためのレポと、コーダーのレポの結果のみ、または「画像ソース」のみ(私はかつて.svgファイルのみのプロジェクトとmake / inscape cliを介して生成された画像を持っていました)。

しかし、VCSがそれを処理できない場合、または使用できなくなった場合、それはあなたの仕事に適切なツールではないと言うでしょう。

これまでのところ、gitのWebプロジェクトに「通常の」量のグラフィックス(モックアップ、コンセプト、およびページグラフィックス)を配置しても問題はありませんでした。


5

画像をSCMに保存する必要がありますか:はい。間違いなく。

画像をgitに保存する必要があります:これはよりトリッキーになります。

gitはテキストファイルでは非常に優れていますが、その性質上、バイナリではそれほど熱くありません。クローンまたはプッシュするときに転送されるデータのサイズに問題があり、.gitディレクトリが大きくなり、マージで混乱する可能性があります(つまり、2つのイメージをマージする方法)。

1つの答えは、サブモジュールを使用することです。これは、プロジェクトと画像間のリンクが弱くなることを意味します。したがって、画像をソースの一部であるかのように管理する必要はありませんが、制御されたままであり、サブプロジェクトが通常の開発プロセス中に同じチャーンを通過しないデータの単なる「フラットな」リポジトリであると仮定すると、それらのブランチの心配があります。

他の答えは、それらを別のプロジェクトに入れて、決して分岐させず、そのプロジェクトにコミットする全員がすぐにそれを上流にプッシュすることです-2人が同じバージョンのファイルを変更することは決してありません-あなたはこれが最も難しいとわかりますgitとしてのアスペクトは、そのような非分散型のワークフロー向けには設計されていません。このルールを施行するには、昔ながらの通信方法を使用する必要があります。

3番目の答えは、イメージの操作に適した別のSCMに完全に配置することです。


0

@haylemの答えに加えて、サイズがこの点で大きな要因になることに注意してください。VCSによっては、大量の画像でうまく機能しない場合があります。クローンや大規模なプッシュが一晩中かかり始めると、すべてのイメージがすでにリポジトリにあるため、本当に遅すぎます。

大きな写真と将来の成長を計画します。このプロジェクトに2年を費やしたくはありませんし、「レポが少し大きすぎるかもしれません。」


1
質問はgitに固有であるため、あなたの答えはやや無関係です。gitリポジトリでサイズが大きな(または他の)要因を果たしているかどうかを知っていますか?
ヤニス

@Yannisその最初の文を見逃していなければならない...知る限り、gitはより大きなリポジトリで優れていますが、巨大なクローンまたはプッシュが問題であるため、サイズの問題は依然として関連しています
-TheLQ

GITを使用すると、リポジトリが再配置され、部分的なクローンなどを作成するのが簡単になります(これが問題になった場合)。数十年前の改訂管理ツールの歴史的な廃糖蜜を今日のものと混同しないでください。
-mattnz

0

それらを技術的および経済的に保管することが実現可能であることに私は間違いなく同意します。質問「これらの画像は出荷製品の一部ですか、それとも出荷製品のコンテンツの一部ですか?」GIT(または他のVCS)にコンテンツを保存できないことではなく、別のVCSにとっては別の問題です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.