2

StackExchange に関する多くの回答は、履歴内のすべてのコミットから特定のファイルを次のように削除することを扱っています。

git filter-branch --prune-empty -d /dev/shm/scratch \
 --index-filter "git rm --cached -f --ignore-unmatch filename" \
 --tag-name-filter cat -- --all

ただし、私のレポには、時間の経過とともに大量のデータがプッシュされていたため、現在の作業ツリーにないすべてのファイルを除外することで、そのサイズを大幅に削減したいと考えています。

man ページから、次の方法でインデックスに対してこれを行うことができます。

git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

私が収集できるものから、最初の部分は削除されたすべてのファイルの名前を取得し、2 番目の部分はそれらをキャッシュされたバージョンから削除します。

私がうまくいかないのは、rmコマンドのフィルターブランチバージョンを変更して、そのバージョンのインデックスをヘッドと比較するように変更する方法です(したがって、削除されたすべてのファイルを削除します)。

これの目的は、現在の作業ツリーに存在しない、履歴内のすべてのファイルを削除することです。

4

1 に答える 1

1

これの目的は、現在の作業ツリーに存在しない、履歴内のすべてのファイルを削除することです。

を使用していますがgit filter branch、BFG Repo Cleaner (より高速でシンプルな代替手段) の使用を検討することをお勧めします。若干の違いがあります:

  • 現在のHEADコミットにないファイルのすべての履歴、つまり、最新のコミットの完全なファイルツリーを削除しようとしていると思います
  • BFG を使用すると、サイズまたは名前 (ワイルドカードを含む) で指定したファイルのすべてのバージョンを削除でき、最新の commit にあるファイル バージョンのみが保持されます

...使用する場合:

$ bfg --delete-files "*.png"

...現在のコミットにあるファイル.pngの特定のバージョンを除いて、すべてのファイルがプロジェクト履歴から削除されます。.pngファイルの特定のバージョンが履歴のどこかに 1 回出現する場合、それは 1000 回も発生する可能性があることに注意してください。git に関する限り、同じストレージ要件があります。

私のレポには、時間の経過とともに大量のデータがプッシュされていたので、そのサイズを大幅に削減したいと考えています

あなたの全体的な目的はサイズを小さくすることなので、それを達成する限り、あなたは幸せです! したがって、次のように実行できます。

$ bfg --strip-blobs-bigger-than 10K

...そして、サイズが10キロバイトを超えるすべての(最新ではない)ファイルが削除されます-リポジトリのサイズが大幅に削減され、副次的な利点として、問題のない小さなファイルの履歴が保持されます.

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

于 2019-07-09T11:56:39.297 に答える