Git Filter-Repo を使用して BLOB を除去する方法

Python, Shell

Git での BLOB ストリッピングを理解する

Git では、特に作業コピーでファイルが不要になった場合、大きなファイルの管理が困難になることがあります。 BFG や Git Filter-Repo などのツールは、リポジトリの履歴からこれらの大きなファイルを削除するためのソリューションを提供します。ただし、Git Filter-Repo で BFG と同じ結果を達成するのは難しい場合があります。

この記事では、BFG コマンドを複製する方法について説明します。 --strip-blobs-より大きい Git フィルター リポジトリを使用します。一般的な問題に対処し、まだ使用中のファイルを誤って削除することなくリポジトリを効果的にクリーンアップできるようにするためのステップバイステップのガイドを提供します。

指示 説明
from git import Repo GitPython ライブラリの Repo クラスをインポートして、Git リポジトリと対話します。
git_filter_repo import RepoFilter リポジトリ BLOB をフィルター処理するために git-filter-repo から RepoFilter クラスをインポートします。
repo = Repo(repo_path) 指定されたリポジトリ パスを指す Repo オブジェクトを初期化します。
RepoFilter(repo).filter_blobs(filter_large_blobs) カスタム フィルター関数を適用して、リポジトリから大きな BLOB を削除します。
git rev-list --objects --all BLOB、ツリー、コミットなど、リポジトリ内のすべてのオブジェクトを一覧表示します。
git cat-file --batch-check サイズなど、オブジェクトに関する詳細情報を提供します。
xargs -n 1 git filter-repo --strip-blobs-bigger-than $SIZE_LIMIT xargs を使用して、特定された各大きな BLOB に git filter-repo コマンドを適用します。

提供されたスクリプトの動作方法

Python スクリプトは、GitPython ライブラリを利用して Git リポジトリと対話します。リポジトリは次を使用して初期化されます そして 、指定されたリポジトリ パスを指します。次に、スクリプトはフィルター関数を定義します。 10MB を超える BLOB を識別します。このフィルターは次を使用して適用されます RepoFilter(repo).filter_blobs(filter_large_blobs)これにより、サイズ制限を超えた BLOB がリポジトリの履歴から確実に削除されます。

シェル スクリプトは、Git コマンドとシェル ユーティリティを使用して同様の目的を達成します。次のようにしてリポジトリ ディレクトリに移動します。 を使用してすべてのオブジェクトをリストします 。各オブジェクトのサイズは次のようにチェックされます。 。指定されたサイズ制限を超えるオブジェクトはフィルタリングされ、次の方法で処理されます。 xargs 応募する 識別されたそれぞれの大きな塊に。この方法では、大きな BLOB がリポジトリから効果的に削除され、不要な大きなファイルのないクリーンな履歴が保証されます。

Python を使用して Git BLOB をサイズでフィルタリングする

大きな BLOB をフィルタリングするための Python スクリプト

# Import necessary modules
import os
from git import Repo
from git_filter_repo import RepoFilter

# Define the repository path and size limit
repo_path = 'path/to/your/repo'
size_limit = 10 * 1024 * 1024  # 10 MB

# Initialize the repository
repo = Repo(repo_path)

# Define a filter function to remove large blobs
def filter_large_blobs(blob):
    return blob.size > size_limit

# Apply the filter to the repository
RepoFilter(repo).filter_blobs(filter_large_blobs)

シェル スクリプトを使用した大きな Git BLOB の特定と削除

Git での BLOB 管理のためのシェル スクリプト

#!/bin/bash

# Define repository path and size limit
REPO_PATH="path/to/your/repo"
SIZE_LIMIT=10485760  # 10 MB

# Navigate to the repository
cd $REPO_PATH

# List blobs larger than the size limit
git rev-list --objects --all |
git cat-file --batch-check='%(objectname) %(objecttype) %(objectsize) %(rest)' |
awk '$3 >= $SIZE_LIMIT {print $1}' |
xargs -n 1 git filter-repo --strip-blobs-bigger-than $SIZE_LIMIT

echo "Large blobs removed from the repository"

高度な Git フィルター リポジトリ オプションの探索

その間 大きなファイルの削除には効果的ですが、リポジトリのクリーンアップをカスタマイズするための追加オプションがあります。たとえば、次のように使用できます 操作を特定のファイルまたはディレクトリに制限します。これにより、リポジトリの特定の領域のみを BLOB 削除の対象にすることができます。もう 1 つの便利なオプションは、 これにより、指定されたパスが操作から除外され、どのファイルが変更されないのかをより詳細に制御できるようになります。

さらに、組み合わせることができます と 変更を適用する前に変更をプレビューします。これにより、削除される内容の詳細なレポートが提供されるため、意図しない削除を回避できます。これらの高度なオプションを利用すると、リポジトリのメンテナンス タスクの柔軟性と精度が向上し、よりクリーンで効率的なプロジェクト履歴が保証されます。

  1. どういうことですか する?
  2. 指定したサイズより大きい BLOB をリポジトリ履歴から削除します。
  3. どうやって 仕事?
  4. 指定されたパスをフィルターによる処理から除外します。
  5. 変更を適用する前に変更をプレビューできますか?
  6. はい、使用しています 変更の詳細なレポートを提供します。
  7. 特定のファイルまたはディレクトリをターゲットにするにはどうすればよいですか?
  8. 使用 操作を特定のパスに制限するオプション。
  9. の目的は何ですか Pythonのクラス?
  10. これにより、カスタム フィルターをリポジトリに適用できるようになります。
  11. による変更を元に戻す方法はありますか ?
  12. 変更が適用されると、簡単に元に戻すことはできません。必ず最初にリポジトリをバックアップしてください。
  13. どういうことですか する?
  14. BLOB、ツリー、コミットなど、リポジトリ内のすべてのオブジェクトが一覧表示されます。
  15. なぜ使うのか と ?
  16. 削除対象として特定された大きな BLOB などのアイテムのリストにコマンドを適用するのに役立ちます。

Git リポジトリ内の大きなファイルを効果的に管理することは、パフォーマンスとストレージを最適化するために不可欠です。 BFG や Git Filter-Repo などのツールを使用すると、このプロセスを合理化できますが、それぞれに独自のコマンドとメソッドがあります。高度なオプションを利用し、各ツールの微妙な違いを理解することで、リポジトリをクリーンで効率的な状態に保つことができます。データの損失を避けるために、大幅な変更を加える前に必ずリポジトリをバックアップしてください。これらのツールの知識と戦略的計画を組み合わせることで、バージョン管理の実践が大幅に強化されます。