จะค้นหา / ระบุการผูกพันขนาดใหญ่ในประวัติศาสตร์คอมไพล์ได้อย่างไร?


366

ฉันมี repo git 300 MB ขนาดรวมของไฟล์ที่ฉันเช็กเอาต์ในปัจจุบันคือ 2 MB และขนาดทั้งหมดของ git repo ที่เหลือคือ 298 MB นี่เป็น repo แบบรหัสเท่านั้นที่ไม่ควรเกินสองสาม MB

ฉันสงสัยว่ามีคนส่งไฟล์ขนาดใหญ่ (วิดีโอรูปภาพ ฯลฯ ) โดยไม่ได้ตั้งใจแล้วลบออก ... แต่ไม่ใช่จากคอมไพล์ดังนั้นประวัติยังคงมีไฟล์ขนาดใหญ่ที่ไม่มีประโยชน์ จะหาไฟล์ขนาดใหญ่ในประวัติคอมไพล์ได้อย่างไร? มีข้อผูกมัดมากกว่า 400 ข้อดังนั้นการทำแบบตัวต่อตัวจึงไม่เป็นประโยชน์

หมายเหตุ : คำถามของฉันไม่ได้เกี่ยวกับวิธีลบไฟล์แต่จะค้นหาได้อย่างไรในตอนแรก



คำตอบ:


143

ฉันพบสคริปต์นี้มีประโยชน์มากในอดีตสำหรับการค้นหาวัตถุขนาดใหญ่ (และไม่ชัดเจน) ในที่เก็บ git:


#!/bin/bash
#set -x 

# Shows you the largest objects in your repo's pack file.
# Written for osx.
#
# @see https://stubbisms.wordpress.com/2009/07/10/git-script-to-show-largest-pack-objects-and-trim-your-waist-line/
# @author Antony Stubbs

# set the internal field separator to line break, so that we can iterate easily over the verify-pack output
IFS=$'\n';

# list all objects including their size, sort by size, take top 10
objects=`git verify-pack -v .git/objects/pack/pack-*.idx | grep -v chain | sort -k3nr | head`

echo "All sizes are in kB's. The pack column is the size of the object, compressed, inside the pack file."

output="size,pack,SHA,location"
allObjects=`git rev-list --all --objects`
for y in $objects
do
    # extract the size in bytes
    size=$((`echo $y | cut -f 5 -d ' '`/1024))
    # extract the compressed size in bytes
    compressedSize=$((`echo $y | cut -f 6 -d ' '`/1024))
    # extract the SHA
    sha=`echo $y | cut -f 1 -d ' '`
    # find the objects location in the repository tree
    other=`echo "${allObjects}" | grep $sha`
    #lineBreak=`echo -e "\n"`
    output="${output}\n${size},${compressedSize},${other}"
done

echo -e $output | column -t -s ', '

ที่จะให้ชื่อวัตถุ (SHA1sum) ของ blob จากนั้นคุณสามารถใช้สคริปต์แบบนี้:

... เพื่อค้นหาการกระทำที่ชี้ไปที่แต่ละ blobs


31
คำตอบนี้มีประโยชน์จริง ๆ เพราะมันส่งฉันไปที่โพสต์ด้านบน ในขณะที่สคริปต์ของโพสต์ทำงานได้ฉันพบว่ามันช้าอย่างเจ็บปวด ดังนั้นฉันจึงเขียนใหม่และตอนนี้มันเร็วขึ้นอย่างมากสำหรับที่เก็บขนาดใหญ่ ได้ดู: gist.github.com/nk9/b150542ef72abc7974cb
นิค K9

7
โปรดใส่คำแนะนำแบบเต็มในคำตอบของคุณไม่ใช่เฉพาะลิงก์นอกสถานที่ เราจะทำอย่างไรเมื่อ stubbisms.wordpress.com หลีกเลี่ยงไม่ได้ใช่มั้ย
ThorSummoner

@ NickK9 ที่น่าสนใจฉันได้รับผลลัพธ์ที่แตกต่างจากสคริปต์ของคุณและอื่น ๆ มีชิ้นส่วนวัตถุขนาดใหญ่ที่คุณพลาดไม่ได้ มีบางอย่างที่ฉันขาดหายไปหรือไม่?
UpAndAdam

โอ้เยี่ยมมาก! ขอบคุณที่ทำให้สคริปต์ของฉันเร็วขึ้น @nick \ k9: D @UpAndAdam คุณกำลังบอกว่าสคริปต์ของฉันสร้างผลลัพธ์ที่ไม่ถูกต้องหรือไม่?
Antony Stubbs

1
ความคิดเห็นเหล่านี้ทำให้ดูเหมือนว่าเรารายงานขนาดเป็นไบต์ แต่ฉันได้รับกิโลไบต์
Kat

681

shell เปลือกอย่างรวดเร็วที่โดดเด่นหนึ่งซับ🚀

เชลล์สคริปต์นี้แสดงวัตถุ Blob ทั้งหมดในที่เก็บซึ่งเรียงลำดับจากที่เล็กที่สุดไปหามากที่สุด

สำหรับ repo ตัวอย่างของฉันมันวิ่งเร็วกว่าที่พบที่นี่ประมาณ100 เท่า
ในระบบ X4 Athlon II เชื่อถือของฉันก็จัดการเก็บข้อมูล Linux Kernelกับ 5600000 วัตถุในเพียงนาที

สคริปต์ฐาน

git rev-list --objects --all \
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
| sed -n 's/^blob //p' \
| sort --numeric-sort --key=2 \
| cut -c 1-12,41- \
| $(command -v gnumfmt || echo numfmt) --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest

เมื่อคุณเรียกใช้โค้ดข้างต้นคุณจะได้ผลลัพธ์ที่มนุษย์อ่านง่ายเช่นนี้

...
0d99bb931299  530KiB path/to/some-image.jpg
2ba44098e28f   12MiB path/to/hires-image.png
bd1741ddce0d   63MiB path/to/some-video-1080p.mp4

ผู้ใช้ MacOS : เนื่องจากnumfmtไม่สามารถใช้ได้กับ MacOS brew install coreutilsคุณสามารถละเว้นบรรทัดสุดท้ายและการจัดการที่มีขนาดไบต์ดิบหรือ

กรอง

เพื่อให้บรรลุการกรองต่อไปใส่ใด ๆ ของบรรทัดต่อไปนี้ก่อนที่จะsortสาย

ในการแยกไฟล์ที่มีอยู่HEADให้แทรกบรรทัดต่อไปนี้:

| grep -vF --file=<(git ls-tree -r HEAD | awk '{print $3}') \

หากต้องการแสดงเฉพาะไฟล์ที่เกินขนาดที่กำหนด (เช่น 1 MiB = 2 20  B) ให้แทรกบรรทัดต่อไปนี้:

| awk '$2 >= 2^20' \

ผลผลิตสำหรับคอมพิวเตอร์

หากต้องการสร้างผลลัพธ์ที่เหมาะสำหรับการประมวลผลเพิ่มเติมโดยคอมพิวเตอร์ให้เว้นสองบรรทัดสุดท้ายของสคริปต์ฐาน พวกเขาทำการจัดรูปแบบทั้งหมด สิ่งนี้จะทำให้คุณมีอะไรเช่นนี้:

...
0d99bb93129939b72069df14af0d0dbda7eb6dba 542455 path/to/some-image.jpg
2ba44098e28f8f66bac5e21210c2774085d2319b 12446815 path/to/hires-image.png
bd1741ddce0d07b72ccf69ed281e09bf8a2d0b2f 65183843 path/to/some-video-1080p.mp4

การลบไฟล์

สำหรับการกำจัดไฟล์จริงตรวจสอบคำถามนี้ดังนั้นในหัวข้อ


14
สิ่งนี้สมควรได้รับมากกว่าเพียงแค่ upvote ของฉัน! ขอขอบคุณเป็นพิเศษสำหรับการให้ทั้งคอมพิวเตอร์และเอาต์พุตที่มนุษย์อ่านได้
Michel Jung

2
มันใช้งานง่ายและรวดเร็วมาก!
Chin

31
ที่จะใช้นี้บน Mac คุณต้องbrew install coreutilsแล้วแทนที่cutด้วยgcutและมีnumfmt gnumfmt
Nick Sweeting

2
ให้ฉันเน้นอีกครั้ง - เร็วกว่ารายการอื่น ๆ ที่ฉันเคยเห็น
Sridhar Sarnobat

4
มันทำให้นามแฝงคอมไพล์ที่น่ากลัว :) git largeทุกคน?
anarcat

160

ฉันได้พบวิธีแก้ปัญหาสายการบินเดียวในหน้าวิกิวิชา ETH ซูริคสาขาฟิสิกส์ (ใกล้ถึงจุดสิ้นสุดของหน้านั้น) เพียงทำgit gcเพื่อลบขยะเก่าแล้ว

git rev-list --objects --all \
  | grep "$(git verify-pack -v .git/objects/pack/*.idx \
           | sort -k 3 -n \
           | tail -10 \
           | awk '{print$1}')"

จะให้ 10 ไฟล์ที่ใหญ่ที่สุดในพื้นที่เก็บข้อมูล

นอกจากนี้ยังมีโซลูชัน lazier ให้บริการแล้วในตอนนี้GitExtensionsมีปลั๊กอินที่ทำสิ่งนี้ใน UI (และจัดการการเขียนประวัติอีกด้วย)

กล่องโต้ตอบ 'ค้นหาไฟล์ขนาดใหญ่' GitExtensions


8
ซับหนึ่งใช้งานได้หากคุณต้องการรับไฟล์ที่ใหญ่ที่สุดไฟล์เดียว (เช่นใช้ tail -1) ขึ้นบรรทัดใหม่เพื่อรับสิ่งที่ยิ่งใหญ่กว่า คุณสามารถใช้ sed เพื่อแปลงบรรทัดใหม่เพื่อ grep จะเล่นดี:git rev-list --objects --all | grep -E `git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -10 | awk '{print$1}' | sed ':a;N;$!ba;s/\n/|/g'`
Throctukes

10
grep: a70783fca9bfbec1ade1519a41b6cc4ee36faea0: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
Jonathan Allard

1
ลิงก์ wiki ย้ายไปที่: readme.phys.ethz.ch/documentation/git_advanced_hints
outsmartin

11
การค้นหา Git ส่วนขยายก็เหมือนกับการหาหม้อทองคำและจุดจบของสายรุ้ง - ขอบคุณ!
ckapilla

3
มีนามสกุลที่พิมพ์ขนาดของไฟล์หรือไม่
Michael

27

ขั้นตอนที่ 1เขียนไฟล์ทั้งหมด SHA1s ไปยังไฟล์ข้อความ:

git rev-list --objects --all | sort -k 2 > allfileshas.txt

ขั้นตอนที่ 2เรียงลำดับ blobs จากใหญ่ที่สุดไปหาเล็กที่สุดและเขียนผลลัพธ์ไปยังไฟล์ข้อความ:

git gc && git verify-pack -v .git/objects/pack/pack-*.idx | egrep "^\w+ blob\W+[0-9]+ [0-9]+ [0-9]+$" | sort -k 3 -n -r > bigobjects.txt

ขั้นตอนที่ 3aรวมทั้งไฟล์ข้อความเพื่อรับข้อมูลชื่อไฟล์ / sha1 / size:

for SHA in `cut -f 1 -d\  < bigobjects.txt`; do
echo $(grep $SHA bigobjects.txt) $(grep $SHA allfileshas.txt) | awk '{print $1,$3,$7}' >> bigtosmall.txt
done;

ขั้นตอนที่ 3 ขหากคุณมีชื่อไฟล์หรือชื่อพา ธ ที่มีช่องว่างให้ลองชุดรูปแบบของขั้นตอนที่ 3a นี้ มันใช้cutแทนawkการได้รับคอลัมน์ที่ต้องการรวม ช่องว่างจากคอลัมน์ 7 ถึงปลายบรรทัด:

for SHA in `cut -f 1 -d\  < bigobjects.txt`; do
echo $(grep $SHA bigobjects.txt) $(grep $SHA allfileshas.txt) | cut -d ' ' -f'1,3,7-' >> bigtosmall.txt
done;

ตอนนี้คุณสามารถดูไฟล์ bigtosmall.txt เพื่อตัดสินใจว่าไฟล์ใดที่คุณต้องการลบออกจากประวัติ Git ของคุณ

ขั้นตอนที่ 4เพื่อทำการลบ (หมายเหตุส่วนนี้จะช้าเพราะมันจะตรวจสอบการคอมมิททุกครั้งในประวัติของคุณสำหรับข้อมูลเกี่ยวกับไฟล์ที่คุณระบุ):

git filter-branch --tree-filter 'rm -f myLargeFile.log' HEAD

แหล่ง

ขั้นตอนที่ 1-3 กถูกคัดลอกจากการค้นหาและลบล้างไฟล์ขนาดใหญ่จากประวัติ Git

แก้ไข

บทความนี้ถูกลบออกในช่วงครึ่งหลังของปี 2017 แต่สำเนาเก็บไว้มันยังสามารถเข้าถึงได้โดยใช้เครื่อง Wayback


6
สายการบินเดียวที่ทำสิ่งเดียวกัน:git gc && join -e ERROR -a 2 -j 1 -o 2.1,2.3,1.2 --check-order <( git rev-list --objects --all | sort -k 1 ) <( git verify-pack -v .git/objects/pack/pack-*.idx | gawk '( NF == 5 && $2 == "blob" ){print}' | sort -k1 ) | sort -k2gr
Iwan Aucamp

1
@Iwan ขอบคุณสำหรับหนึ่งซับ! join -t' ' -e ERROR -a 2 -j 1 -o 2.1,2.3,1.2 --check-order <( git rev-list --objects --all | sed 's/[[:space:]]/\t/' | sort -k 1 ) <( git verify-pack -v .git/objects/pack/pack-*.idx | gawk '( NF == 5 && $2 == "blob" ){print}' | sort -k1 | sed 's/[[:space:]]\+/\t/g' ) | sort -k2gr | lessมันไม่ได้จัดการกับชื่อไฟล์ที่มีช่องว่างในพวกเขานี้ดูเหมือนว่า: โปรดทราบว่าคุณต้องป้อนอักขระ TAB จริงหลังจากjoin -t'ใช้ CTRL + V <TAB> ต่อgeekbraindump.blogspot.ru/2009/04/unix-join-with-tabs.html
Nickolay

2
@Nickolay กับ bash $'\t'ควรให้แท็บแก่คุณ echo -n $'\t' | xxd -ps->09
Iwan Aucamp

1
@IwanAucamp: ดียิ่งขึ้นขอบคุณสำหรับเคล็ดลับ! (แย่มากที่ฉันไม่สามารถแก้ไขความคิดเห็นก่อนหน้านี้ .. โอเค)
Nickolay

1
@ Sridhar-Sarnobat บทความถูกบันทึกโดยเครื่อง Wayback! :) web.archive.org/web/20170621125743/http://www.naleid.com/blog/…
Friederbluemle

18

คุณควรใช้BFG Repo-ทำความสะอาด

ตามเว็บไซต์:

BFG เป็นทางเลือกที่ง่ายกว่าและเร็วกว่าสำหรับ git-filter-branch สำหรับล้างข้อมูลที่ไม่ดีออกจากที่เก็บ Git ของคุณ:

  • การลบไฟล์ Crazy Big
  • การลบรหัสผ่านข้อมูลรับรองและข้อมูลส่วนตัวอื่น ๆ

ขั้นตอนแบบคลาสสิกสำหรับการลดขนาดของที่เก็บจะเป็น:

git clone --mirror git://example.com/some-big-repo.git
java -jar bfg.jar --strip-biggest-blobs 500 some-big-repo.git
cd some-big-repo.git
git reflog expire --expire=now --all
git gc --prune=now --aggressive
git push

4
BFG Repo-Cleaner ดีมาก มันเบาลงอย่างรวดเร็วและทำงานได้อย่างน่าเชื่อถือ
fschmitt

30
สิ่งนี้ไม่ได้บอกคุณถึงวิธีแสดงรายการไฟล์ที่ใหญ่ที่สุดทั้งหมด
Andi Jay

5
ปัญหาของเรื่องนี้คือคุณไม่สามารถดูได้ว่ามีไฟล์อะไรบ้างที่ใหญ่โดยไม่ต้องลบออกจริงๆ ฉันรู้สึกไม่สบายใจที่จะทำสิ่งนี้โดยที่ไม่ต้องวิ่งให้แห้งเสียก่อนซึ่งจะแสดงรายการไฟล์ขนาดใหญ่
Sridhar Sarnobat

อะไร--strip-biggest-blobs 500ทำอย่างไร
2540625

git จะปฏิเสธการเปลี่ยนแปลงที่เครื่องมือนี้ทำ
Christopher

9

หากคุณต้องการมีรายการไฟล์ขนาดใหญ่เท่านั้นฉันอยากจะจัดเตรียมไฟล์ซับแบบต่อไปนี้ให้คุณ:

join -o "1.1 1.2 2.3" <(git rev-list --objects --all | sort) <(git verify-pack -v objects/pack/*.idx | sort -k3 -n | tail -5 | sort) | sort -k3 -n

ซึ่งการส่งออกจะเป็น:

commit       file name                                  size in bytes

72e1e6d20... db/players.sql 818314
ea20b964a... app/assets/images/background_final2.png 6739212
f8344b9b5... data_test/pg_xlog/000000010000000000000001 1625545
1ecc2395c... data_development/pg_xlog/000000010000000000000001 16777216
bc83d216d... app/assets/images/background_1forfinal.psd 95533848

รายการสุดท้ายในรายการชี้ไปที่ไฟล์ที่ใหญ่ที่สุดในประวัติ git ของคุณ

คุณสามารถใช้ผลลัพธ์นี้เพื่อรับรองว่าคุณจะไม่ลบเนื้อหาด้วยBFG ที่คุณต้องการในประวัติของคุณ


2
น่ากลัว !! อย่างไรก็ตามคุณควรทราบว่าคุณต้องโคลน repo ด้วยตัวเลือก --mirror ก่อนที่จะเรียกใช้คำสั่งนี้
Andi Jay

ฉันอยากรู้ว่า1.1, 1.2, 2.3ตัวเลขคืออะไร
ympostor

ตัวเลขคือรายการของการ<filenumber>.<field>ระบุลำดับของชุดค่าผสม ดูman.cx/joinสำหรับข้อมูลเพิ่มเติม
schmijos

6

หากคุณใช้ Windows นี่คือสคริปต์ PowerShell ที่จะพิมพ์ไฟล์ที่ใหญ่ที่สุด 10 ไฟล์ในที่เก็บของคุณ:

$revision_objects = git rev-list --objects --all;
$files = $revision_objects.Split() | Where-Object {$_.Length -gt 0 -and $(Test-Path -Path $_ -PathType Leaf) };
$files | Get-Item -Force | select fullname, length | sort -Descending -Property Length | select -First 10

1
สิ่งนี้สร้างคำตอบที่แตกต่างจาก @raphinesse โดยขาดไฟล์ใหญ่ที่สุดในที่เก็บของฉัน นอกจากนี้เมื่อไฟล์ขนาดใหญ่หนึ่งไฟล์มีการแก้ไขจำนวนมากจะรายงานเฉพาะขนาดที่ใหญ่ที่สุดเท่านั้น
kristianp

You cannot call a method on a null-valued expression. At line: 2 char: 1สคริปต์นี้ล้มเหลวสำหรับฉันที่มีข้อผิดพลาด: อย่างไรก็ตามคำตอบนี้ใช้ได้: stackoverflow.com/a/57793716/2441655 (มันสั้นกว่า)
Venryx

4

ลองgit ls-files | xargs du -hs --threshold=1Mดู

เราใช้คำสั่งด้านล่างใน CI ไปป์ไลน์มันจะหยุดหากพบไฟล์ขนาดใหญ่ใน repo git:

test $(git ls-files | xargs du -hs --threshold=1M 2>/dev/null | tee /dev/stderr | wc -l) -gt 0 && { echo; echo "Aborting due to big files in the git repository."; exit 1; } || true

2

ฉันไม่สามารถใช้คำตอบที่ได้รับความนิยมมากที่สุดได้เนื่องจาก--batch-checkสวิตช์บรรทัดคำสั่งเป็น Git 1.8.3 (ที่ฉันต้องใช้) ไม่ยอมรับอาร์กิวเมนต์ใด ๆ มีการทดลองขั้นตอนต่อไปบน CentOS 6.5 ด้วย Bash 4.1.2

แนวคิดหลัก

ใน Git คำว่าblobหมายถึงเนื้อหาของไฟล์ โปรดทราบว่าการกระทำอาจเปลี่ยนแปลงเนื้อหาของไฟล์หรือชื่อพา ธ ดังนั้นไฟล์เดียวกันอาจหมายถึงหยดอื่นที่แตกต่างกันขึ้นอยู่กับการกระทำ ไฟล์บางไฟล์อาจใหญ่ที่สุดในลำดับชั้นของไดเรกทอรีในหนึ่งคอมมิชชันในขณะที่ไม่ได้อยู่ในอีกไฟล์หนึ่ง ดังนั้นคำถามของการค้นหาคำสัญญาที่มีขนาดใหญ่แทนที่จะเป็นไฟล์ขนาดใหญ่

สำหรับคนใจร้อน

คำสั่งเพื่อพิมพ์รายการของ blobs ตามลำดับจากมากไปน้อยคือ:

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

หากต้องการลบ blobs ดังกล่าวให้ใช้BFG Repo Cleanerตามที่ระบุไว้ในคำตอบอื่น ๆ รับไฟล์blobs.txtที่มี hash blob เช่น:

3a51a45e12d4aedcad53d3a0d4cf42079c62958e
7c357f2c2a7b33f939f9b7125b155adbd7890be2

ทำ:

java -jar bfg.jar -bi blobs.txt <repo_dir>

คำถามคือเกี่ยวกับการค้นหาความมุ่งมั่นซึ่งเป็นงานมากกว่าการค้นหา blobs หากต้องการทราบว่าโปรดอ่าน

การทำงานต่อไป

ให้แฮชการกระทำคำสั่งที่พิมพ์ hash ของวัตถุทั้งหมดที่เกี่ยวข้องกับมันรวมถึง blobs คือ:

git ls-tree -r --full-tree <commit_hash>

ดังนั้นถ้าเรามีเอาท์พุทดังกล่าวสำหรับคอมมิชชันทั้งหมดใน repo จากนั้นให้แฮชของหยดนั้นพวงของคอมมิทนั้นเป็นอันที่ตรงกับเอาท์พุทใด ๆ แนวคิดนี้ถูกเข้ารหัสในสคริปต์ต่อไปนี้:

#!/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จะแสดงรายการแฮชของหยดหนึ่งรายการต่อบรรทัด create_db()ฟังก์ชั่นบันทึกแคชของทั้งหมดที่กระทำรายชื่อในไดเรกทอรีย่อยในไดเรกทอรีปัจจุบัน

สถิติบางอย่างจากการทดลองของฉันในระบบที่มีโปรเซสเซอร์ Intel (R) Xeon (R) CPU E5-2620 2.00GHz สองตัวที่นำเสนอโดยระบบปฏิบัติการเป็น 24 คอร์เสมือน:

  • จำนวนคอมมิตทั้งหมดใน repo = เกือบ 11,000
  • ความเร็วในการสร้างไฟล์ = 126 ไฟล์ / s สคริปต์สร้างไฟล์เดียวต่อการส่งมอบ สิ่งนี้จะเกิดขึ้นเมื่อมีการสร้างแคชเป็นครั้งแรกเท่านั้น
  • ค่าใช้จ่ายในการสร้างแคช = 87 วิ
  • ความเร็วในการค้นหาเฉลี่ย = 522 คอมมิต / วิ การปรับให้เหมาะสมของแคชส่งผลให้เวลาในการรันลดลง 80%

โปรดทราบว่าสคริปต์เป็นเธรดเดียว ดังนั้นจะใช้แกนเดียวเท่านั้นในช่วงเวลาหนึ่ง


2

วิธีแก้ปัญหา Powershell สำหรับ windows git ค้นหาไฟล์ที่ใหญ่ที่สุด:

git ls-tree -r -t -l --full-name HEAD | Where-Object {
 $_ -match '(.+)\s+(.+)\s+(.+)\s+(\d+)\s+(.*)'
 } | ForEach-Object {
 New-Object -Type PSObject -Property @{
     'col1'        = $matches[1]
     'col2'      = $matches[2]
     'col3' = $matches[3]
     'Size'      = [int]$matches[4]
     'path'     = $matches[5]
 }
 } | sort -Property Size -Top 10 -Descending

0

ฉันจะติดตามไฟล์ขนาดใหญ่ในประวัติ git ได้อย่างไร?

เริ่มต้นด้วยการวิเคราะห์ตรวจสอบความถูกต้องและเลือกสาเหตุที่แท้จริง ใช้git-repo-analysisเพื่อช่วย

คุณอาจพบค่าบางอย่างในรายงานโดยละเอียดที่สร้างโดยBFG Repo-Cleanerซึ่งสามารถทำงานได้อย่างรวดเร็วโดยการโคลนไปที่หยดมหาสมุทรดิจิตอลโดยใช้ปริมาณงานเครือข่าย 10MiB / s


ฉันคิดว่าคุณมีคำตอบทั่วไปในคำแนะนำ BFG แต่คุณเสียไปโดยไม่ให้รายละเอียดใด ๆ จากนั้นแนะนำให้ใช้บริการบุคคลที่สามที่แตกต่างกัน (โดยไม่มีคำอธิบาย) คุณสามารถล้างสิ่งนี้เพื่อให้เป็นตัวอย่างบรรทัดคำสั่งของการใช้ BFG นี้ได้หรือไม่?
phord

0

ฉันพบสิ่งนี้ด้วยเหตุผลเดียวกันกับคนอื่น แต่สคริปต์ที่ยกมานั้นไม่ได้ผลสำหรับฉัน ฉันได้สร้างสิ่งที่เป็นลูกผสมของสิ่งที่ฉันเคยเห็นและตอนนี้อยู่ที่นี่ - https://gitlab.com/inorton/git-size-calc

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.