--batch-check
Git 1.8.3 へのコマンドライン スイッチ (使用する必要があります) は引数を受け入れないため、最も一般的な回答を利用できませんでした。次の手順は、CentOS 6.5 と Bash 4.1.2 で試行されました。
重要な概念
Git では、blobという用語はファイルの内容を意味します。コミットによって、ファイルまたはパス名の内容が変更される可能性があることに注意してください。したがって、同じファイルがコミットに応じて異なる BLOB を参照する可能性があります。特定のファイルは、あるコミットではディレクトリ階層で最大になり、別のコミットでは最大ではない可能性があります。したがって、大きなファイルではなく大きなコミットを見つけるという問題は、問題を正しい視点に置きます。
せっかちな人向け
サイズの降順でブロブのリストを出力するコマンドは次のとおりです。
git cat-file --batch-check < <(git rev-list --all --objects | \
awk '{print $1}') | grep blob | sort -n -r -k 3
出力例:
3a51a45e12d4aedcad53d3a0d4cf42079c62958e blob 305971200
7c357f2c2a7b33f939f9b7125b155adbd7890be2 blob 289163620
このようなブロブを削除するには、他の回答で述べたように、 BFG Repo Cleanerを使用します。BLOB ハッシュのみを含むファイルblobs.txt
があるとします。たとえば、次のようになります。
3a51a45e12d4aedcad53d3a0d4cf42079c62958e
7c357f2c2a7b33f939f9b7125b155adbd7890be2
行う:
java -jar bfg.jar -bi blobs.txt <repo_dir>
問題は、コミットを見つけることです。これは、ブロブを見つけるよりも多くの作業です。知るために、読んでください。
今後の作業
コミット ハッシュが与えられた場合、それに関連付けられたすべてのオブジェクト (ブロブを含む) のハッシュを出力するコマンドは次のとおりです。
git ls-tree -r --full-tree <commit_hash>
そのため、リポジトリ内のすべてのコミットでそのような出力を利用できる場合、ブロブ ハッシュが与えられると、一連のコミットは出力のいずれかに一致するものになります。このアイデアは、次のスクリプトにエンコードされています。
#!/bin/bash
DB_DIR='trees-db'
find_commit() {
cd ${DB_DIR}
for f in *; do
if grep -q $1 ${f}; then
echo ${f}
fi
done
cd - > /dev/null
}
create_db() {
local tfile='/tmp/commits.txt'
mkdir -p ${DB_DIR} && cd ${DB_DIR}
git rev-list --all > ${tfile}
while read commit_hash; do
if [[ ! -e ${commit_hash} ]]; then
git ls-tree -r --full-tree ${commit_hash} > ${commit_hash}
fi
done < ${tfile}
cd - > /dev/null
rm -f ${tfile}
}
create_db
while read id; do
find_commit ${id};
done
という名前のファイルに内容が保存されている場合find-commits.sh
、通常の呼び出しは次のようになります。
cat blobs.txt | find-commits.sh
前述のように、ファイルblobs.txt
には BLOB ハッシュが 1 行に 1 つずつ一覧表示されます。このcreate_db()
関数は、現在のディレクトリのサブディレクトリにすべてのコミット リストのキャッシュを保存します。
2 つの Intel(R) Xeon(R) CPU E5-2620 2.00GHz プロセッサを搭載したシステムで、OS によって 24 個の仮想コアとして提示された私の実験からのいくつかの統計:
- リポジトリ内のコミットの総数 = ほぼ 11,000
- ファイル作成速度 = 126 ファイル/秒。このスクリプトは、コミットごとに 1 つのファイルを作成します。これは、キャッシュが初めて作成されるときにのみ発生します。
- キャッシュ作成のオーバーヘッド = 87 秒。
- 平均検索速度 = 522 コミット/秒。キャッシュの最適化により、実行時間が 80% 短縮されました。
スクリプトはシングル スレッドであることに注意してください。したがって、一度に使用されるコアは 1 つだけです。