--batch-check
Git 1.8.3へのコマンドラインスイッチ(使用する必要があります)は引数を受け入れないため、最も一般的な回答を利用できませんでした。次の手順は、CentOS 6.5とBash 4.1.2で試行されました
主要な概念
Gitでは、ブロブという用語はファイルの内容を意味します。コミットにより、ファイルまたはパス名の内容が変更される場合があることに注意してください。したがって、コミットに応じて、同じファイルが異なるblobを参照する可能性があります。特定のファイルは、1つのコミットではディレクトリ階層で最大になる可能性がありますが、別のコミットでは最大ではありません。したがって、大きなファイルではなく大きなコミットを見つけるという問題は、問題を正しい見方にしています。
せっかちな人のために
サイズの降順で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
そのようなblobを削除するには、他の回答で述べられているように、BFG Repo Cleanerを使用します。blobs.txt
blobハッシュのみを含むファイルがあるとします。次に例を示します。
3a51a45e12d4aedcad53d3a0d4cf42079c62958e
7c357f2c2a7b33f939f9b7125b155adbd7890be2
行う:
java -jar bfg.jar -bi blobs.txt <repo_dir>
問題は、BLOBを見つけるよりも作業が多いコミットを見つけることです。知って、読んでください。
今後の作業
コミットハッシュを指定すると、それに関連するすべてのオブジェクト(BLOBを含む)のハッシュを出力するコマンドは次のとおりです。
git ls-tree -r --full-tree <commit_hash>
したがって、リポジトリ内のすべてのコミットでこのような出力を利用できる場合、BLOBハッシュを指定すると、コミットの束がいずれかの出力に一致するものになります。このアイデアは、次のスクリプトにエンコードされています。
#!/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
は、1行に1つずつ、Blobハッシュがリストされています。このcreate_db()
関数は、すべてのコミットリストのキャッシュを現在のディレクトリのサブディレクトリに保存します。
OSが24個の仮想コアとして提示する2つのIntel(R)Xeon(R)CPU E5-2620 2.00GHzプロセッサーを搭載したシステムでの私の実験からのいくつかの統計:
- リポジトリ内のコミットの総数=ほぼ11,000
- ファイル作成速度= 126ファイル/秒。スクリプトは、コミットごとに1つのファイルを作成します。これは、キャッシュが初めて作成されるときにのみ発生します。
- キャッシュ作成オーバーヘッド= 87秒。
- 平均検索速度= 522コミット/秒。キャッシュの最適化により、実行時間が80%短縮されました。
スクリプトはシングルスレッドであることに注意してください。したがって、一度に使用されるコアは1つだけです。