いくつかの巨大なメディアファイル(画像と音声ファイル)を含むGitリポジトリがあります。これらのメディアファイルのいくつかのバージョンは、リポジトリに連続してコミットされています。ファイルは同じアセットの連続して改良されたバージョンであり、同じ名前を持っています。
大きくなりすぎているので、Gitリポジトリに最新バージョンのみを保持したいと思います。
これを行う最も簡単な方法は何ですか?
これらの変更をアップストリームリポジトリに正しく伝播するにはどうすればよいですか?
Gitリポジトリの履歴全体から不要なフォルダーの選択を削除する、またはフォルダーの最新バージョンを除くすべてを削除するスクリプト( github Gist here )があります。
すべてのgitリポジトリが~/repos
にあると想定するのはハードコーディングされていますが、それは簡単に変更できます。また、個々のファイルでの作業に簡単に適応できる必要があります。
古いスレッドですが、他の誰かがここでつまずいた場合に備えて…
GitHubとBitbucketはどちらも BFG Repo-Cleaner の使用を推奨しています。
見る:
GitHub:機密データの削除
Bitbucket:リポジトリサイズを縮小 & Bitbucket:Gitリポジトリの保守
1メガバイトを超えるファイル、およびHEADにないjpg、png、mp3を削除する例:
# First get the latest bfg.jar, then:
$ git clone --mirror git://example.com/some-big-repo.git
$ Java -jar bfg.jar --strip-blobs-bigger-than 1M --delete-files '*.{jpg,png,mp3}' some-big-repo.git
$ cd some-big-repo.git
$ git reflog expire --expire=now --all && git gc --Prune=now --aggressive
$ git Push
注:更新されたリビジョンをプッシュしたので、リモートリポジトリも実行する必要がありますgit gc
…そうでなければ、サイズの縮小は見られません。 (例を参照してください https://stackoverflow.com/a/28782154/3419541 )
最後に、リポジトリをre-cloneして、古いメディアファイルblobを誤って再コミットしないようにします。
ProGitブックの メンテナンスとデータ復旧 の章の「オブジェクトの削除」のセクションを確認してください。 gitリポジトリからオブジェクトを削除する方法についての手順を提供します。しかし、それは破壊的であることに注意してください。
すでに述べたように、ここで履歴を書き直すことになります。そのため、git rebase
を実行するには、(もしあれば)共同編集者を取得する必要があります。
履歴から特定のファイルを取り除くことに関しては、 Githubには素晴らしいチュートリアルがあります 。
今後の解決策については、バイナリファイルをサブモジュールに配置することを検討する必要があります。
Gitのサブモジュールのサポートにより、リポジトリに外部プロジェクトのチェックアウトをサブディレクトリとして含めることができます。サブモジュールは独自のIDを維持します。サブモジュールサポートは、サブモジュールリポジトリの場所とコミットIDを格納するだけなので、含まれているプロジェクト( "superproject")を複製する他の開発者は、同じリビジョンですべてのサブモジュールを簡単に複製できます。スーパープロジェクトの部分的なチェックアウトが可能です。サブモジュールのクローンを作成しないか、一部またはすべてを複製するようにGitに指示できます。
私の知る限り、これを行うことはできません。gitでは、すべてのコミットは、その時点までの全体履歴のコンテンツに依存するためです。したがって、古い大きなファイルを取り除く唯一の方法は、大きなファイルを省略して、コミット履歴全体を(できれば同じコミットタイムスタンプと作成者で)「再生」することです。これにより、完全に別個のコミット履歴が生成されることに注意してください。
これは明らかにあまり実行可能なアプローチではないので、レッスンはおそらく「巨大なバイナリファイルをバージョン管理するためにgitを使用しないでください」です。代わりに、ファイル用に別の(無視された)フォルダーを作成し、別のシステムを使用してファイルをバージョン管理することもできます。