13

取り除きたい大きなブロブがあります。このソリューションを使用してファイルを削除したと思いました: http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/ (ファイルが削除されるよう-- --allに代わりに使用しましたHEADすべての支店から)

rm -rf .git/refs/original/ && git reflog expire --all &&  
    git gc --aggressive --prune

これを介してパックフォルダーを調べましたWhy is my git repository so big?

$ git verify-pack -v .git/objects/pack/pack-*.idx | sort -k3n
... last 4 lines:
bc7ae9801052180b283cd81880753549f0f92587 blob   19464809 749446 305054873
acd5f09a35846bec25ebc324738139e5caabc50f blob   294278199 71381636 39607483
986d152935434b56cf182d8a32e24cb57af75ac3 blob   480385718 108184804 110989119
ba9d1d27ee64154146b37dfaf42ededecea847e1 blob   761172819 27430741 277589990

スクリプトgit-find-blobは、どのコミットがこのブロブを持っていますか?から取得されます。

$ ./git-find-blob ba9d1d27ee64154146b37dfaf42ededecea847e1

しかし、何も見つかりません。

私のリポジトリからそれを取り除く方法はありますか?

4

5 に答える 5

8

を使用git repack -Adして、git に強制的にパックを再構築させ、到達不能なオブジェクトをルーズ オブジェクトにアンパックすることができます。この時点でgit gc --prune=now、到達不能オブジェクトを破棄するために使用できます。

また、実際に reflog の有効期限が切れていることを再確認する必要があります。git reflog expire --allデフォルトで 90 日 (到達不能オブジェクトの場合は 30 日) になると思いますので、代わりに使用することをお勧めします(これはrepack git reflog expire --expire-unreachable=now --all+gc の前に行う必要があります)。

于 2011-09-21T19:53:54.980 に答える
2

まず、git gc呼び出しでは、を使用する必要があり--prune=nowます。これは、デフォルトでは2週間未満のオブジェクトを保持するためです。

次に、デフォルトで使用したコマンドは、コミットgit-find-blobの履歴のみを検索するため、blobが別のブランチにある場合、そのスクリプトはそれを見逃します。HEAD次のように呼び出してみてください。

./git-find-blob ba9d1d27ee64154146b37dfaf42ededecea847e1 --all
于 2011-09-15T15:03:59.423 に答える
2

Git リポジトリから大きなファイルを削除するために設計された、より高速でシンプルな代替手段であるBFG Repo-Cleanerを使用したいと考えています。git-filter-branch

Java jar (Java 6 以上が必要) をダウンロードして、次のコマンドを実行します。

$ java -jar bfg.jar  --strip-blobs-bigger-than 20M  my-repo.git

サイズが 20M を超える (最新のコミットにない) BLOB は、リポジトリの履歴から完全に削除されます。git gcその後、デッド データを消去するために使用できます。

$ git gc --prune=now --aggressive

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

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

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

于 2013-02-01T22:30:37.950 に答える
1

ブロブはクリーンなプッシュの反対側には表示されないため、これが私の解決策になります (新しい場所にプッシュしてから、その場所から複製します)。それを行うより簡単な方法はありますか?

于 2011-09-21T19:27:53.750 に答える
0

同じ問題があります。問題のあるブロブが到達不能なツリーによって参照されていることを発見しました。git-find-blobスクリプトへの追加:

git fsck --full --unreachable | \
while read unreachable obj tree
do
    if [[ ! $obj == "tree" ]]; then
        continue
    fi
    if git ls-tree -r $tree | grep -q "$obj_name" ; then
        echo "$unreachable $obj $tree"
    fi
done

BFG Repo-Cleaner を使用してブロブを削除することはできましたが、ネイティブの git コマンドを使用して問題を解決する方がはるかに幸せです。

于 2013-10-08T21:14:56.960 に答える