--batch-checkGit 1.8.3 için komut satırı anahtarı (kullanmam gereken) herhangi bir argümanı kabul etmediği için en popüler yanıtı kullanamadım. Takip eden adımlar Bash 4.1.2 ile CentOS 6.5 üzerinde denendi
Anahtar kavramlar
Git'te blob terimi bir dosyanın içeriğini ima eder. Bir taahhüdün bir dosyanın veya yol adının içeriğini değiştirebileceğini unutmayın. Böylece, aynı dosya işleme bağlı olarak farklı bir blob ifade edebilir. Belirli bir dosya, bir komut dosyasındaki dizin hiyerarşisindeki en büyük dosya olabilir, ancak başka bir dosyada değil. Bu nedenle, büyük dosyalar yerine büyük taahhütler bulma sorunu, meseleleri doğru perspektife koyar.
Sabırsızlar İçin
Lekeler listesini azalan boyutta yazdırma komutu:
git cat-file --batch-check < <(git rev-list --all --objects | \
awk '{print $1}') | grep blob | sort -n -r -k 3
Örnek çıktı:
3a51a45e12d4aedcad53d3a0d4cf42079c62958e blob 305971200
7c357f2c2a7b33f939f9b7125b155adbd7890be2 blob 289163620
Bu tür lekeleri çıkarmak için , diğer yanıtlarda belirtildiği gibi BFG Repo Temizleyici'yi kullanın . blobs.txtSadece blob karmaları içeren bir dosya verildiğinde, örneğin:
3a51a45e12d4aedcad53d3a0d4cf42079c62958e
7c357f2c2a7b33f939f9b7125b155adbd7890be2
Yapmak:
java -jar bfg.jar -bi blobs.txt <repo_dir>
Soru, lekeleri bulmaktan daha fazla iş olan taahhütleri bulmakla ilgilidir. Bilmek için lütfen okumaya devam edin.
İleri Çalışmalar
Bir sağlama karması verildiğinde, lekeler de dahil olmak üzere kendisiyle ilişkili tüm nesnelerin karmalarını basan bir komut:
git ls-tree -r --full-tree <commit_hash>
Dolayısıyla, repodaki tüm taahhütler için bu tür çıktılarımız varsa, o zaman bir blob karması verilirse, taahhütlerin bir kısmı çıktılardan herhangi biriyle eşleşen olanlardır. Bu fikir aşağıdaki komut dosyasında kodlanmıştır:
#!/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
İçindekiler adlı bir dosyaya kaydedilmişse, find-commits.shtipik bir çağrı aşağıdaki gibi olacaktır:
cat blobs.txt | find-commits.sh
Daha önce olduğu gibi, dosya blobs.txther satırda bir tane olmak üzere blob karmaları listeler. create_db()Fonksiyon tüm önbellek geçerli dizinde bir alt dizinde listeleri işlemek kaydeder.
İşletim sistemi tarafından 24 sanal çekirdek olarak sunulan iki Intel (R) Xeon (R) CPU E5-2620 2.00GHz işlemci içeren bir sistemde yaptığım deneylerden bazı istatistikler:
- Repodaki toplam taahhüt sayısı = yaklaşık 11.000
- Dosya oluşturma hızı = 126 dosya / sn. Komut dosyası her işlem için tek bir dosya oluşturur. Bu yalnızca önbellek ilk kez oluşturulduğunda oluşur.
- Önbellek oluşturma yükü = 87 s.
- Ortalama arama hızı = 522 işlem / sn. Önbellek optimizasyonu, çalışma süresinde% 80 azalma sağladı.
Komut dosyasının tek iş parçacıklı olduğunu unutmayın. Bu nedenle, aynı anda yalnızca bir çekirdek kullanılır.