6

(今まで) git を使用して依存関係を格納するコードベースがあります。リポジトリ自体はここから入手できます(警告: 巨大です)。言うまでもなく、適切なサイズに縮小するには、リポジトリの履歴から依存関係を削除する必要があります。

まず、David Underhill の指示に従ってlib、履歴からディレクトリを削除しました。ただし、これを行った後でも、リポジトリはまだ 300M を超えています。発行git prunegit repackて助かりますが、それでも180Mを超えています。

肥大化したブロブを見つけようとして、発行しました

git verify-pack -v .git/objects/pack/pack-*.idx | grep -v chain | sort -k3nr | head

これらの結果:

105526b5d3d398b9989d88c2f9fc2d1dc96a85b8 blob 35685609 33600527 31978828 d296935e6ac5f3f58b50c789394c9769116e9c34 blob 35658016 33593241 112485744 50636f931180a32764edadd854968a971a083f8a blob 28360290 25897864 233390 b9e4dd37428e879a258f297b7f5bcfb9ba869695 blob 13108002 11640713 66661788 08d2720b2414aa07ce419b17d5f80c333c7313b7 blob 12551621 11124009 89231035 6197a478a461275a0396f20c28487e9ae619a5f9 blob 11975135 11058259 148211988 1 50636f931180a32764edadd854968a971a083f8a 549eb0c73776fd0ede27a2fcb03366f76f45a13c blob 9136086 8166649 166451273 5bc0a0f04a7004bc16cfab1c091c6b369fb74049 blob 9072616 8270262 80951514 741480238a6a6ce612cf089245dd46d6890fba9f blob 8858569 8080252 101294029 744226651c55b14c1aa8affb78fba4fdf02b577c blob 7412220 6766404 186825167

これは私が立ち往生しているところです。git showこれらの blob を確認すると、それらが jar ファイルに非常によく似ていることがわかりますが、なぜまだリポジトリにあるのかわかりません。

ファイル名を見つけるためのさまざまな試みは失敗しました。

git repack -agit repack -ad、およびgit repack -Adすべて効果がないようです。

4

4 に答える 4

14

--prune=nowgit gc で使用する

履歴から不要なオブジェクトを正常に書き出すことができましたが、これらの不要なオブジェクトは、デフォルトでプルーニングするには若すぎるため、プルーニングされていないようです (詳細については、構成ドキュメントを参照してくださいgit gc)。Usingはそれを処理する必要があります。そうしないと、より核心的なオプションについてこの回答git gc --prune=nowを見ることができます。

これで最終的な問題は解決するはずですが、根本的な問題は、大きなブロブを見つけgit filter-branchて削除するのが難しいことでした-これについては、次のように言います。

...git filter-branch を使用しないでください

git filter-branchこのようなタスクに使用するのは面倒です。Git リポジトリから大きなファイルを削除するために特別に設計された BFGと呼ばれる、あまり知られていない、はるかに優れたツールがあります。

大きなファイルを削除するコア コマンドは次のようになります。

$ bfg  --strip-blobs-bigger-than 10MB  my-repo.git

サイズが 10MB を超える (最新のコミットに含まれていない) BLOB は、リポジトリの履歴から完全に削除されます。ファイルを自分で手動で見つける必要はなく、保護されたコミット内のファイルは安全です。

git gcその後、デッド データを消去するために使用できます。

$ git gc --prune=now --aggressive

BFG は通常、大きなレポで実行するよりも数百倍高速であり、オプションは次の 2 つの一般的なユースケースに合わせて調整されています。git-filter-branch

  • 非常に大きなファイルを削除する
  • パスワード、資格情報、その他の個人データの削除

完全な開示: 私は BFG Repo-Cleaner の作成者です。

于 2013-03-02T15:21:52.410 に答える
4

Have you tried running git gc? http://www.kernel.org/pub/software/scm/git/docs/git-gc.html

于 2011-07-30T16:13:47.680 に答える
3

リポジトリ内の各ブランチでDavid Underhill のスクリプトを実行して、すべてのブランチから参照が削除されるようにする必要があります。

次に、以降の説明と同様に、元のリポジトリを使用して新しいリポジトリを初期化するgit initか 、すべてのブランチをプルします。git pullgit remote add origin <original>

$ du -sh ./BIG
299M ./BIG
$ cd BIG
$ git checkout master
$ git-remove-history REMOVE_ME
....
$ git checkout branch2
$ git-remove-history REMOVE_ME
...
$ cd ../SMALL
$ git init
$ git remote add origin ../BIG
$ git fetch --all
$ git checkout master
$ cd ..
$ du -sh ./SMALL ./BIG
26M ./SMALL
244M ./BIG
于 2013-01-03T03:05:23.403 に答える
1

誤っ.jpaて自分のサイトの大きなバックアップを git に保存してしまった -

git filter-branch --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch MY_BIG_DIRECTORY_OR_FILE' --tag-name-filter cat -- --all

問題のフォルダーに置き換えMY_BIG_DIRECTORY_OR_FILEて、タグを含む履歴を完全に書き換えます。

ソース:

http://naleid.com/blog/2012/01/17/finding-and-purging-big-files-from-git-history

于 2014-08-31T19:31:59.773 に答える