গিট ইতিহাসে বড় কমিটগুলি কীভাবে সন্ধান / সনাক্ত করতে হয়?


365

আমার কাছে 300 এমবি গিট রেপো রয়েছে। আমার বর্তমানে পরীক্ষিত ফাইলগুলির মোট আকার 2 এমবি এবং গিট রেপোর বাকী অংশের মোট আকার 298 এমবি। এটি মূলত একটি কোড-কেবল রেপো যা কয়েকটি এমবি-র চেয়ে বেশি হওয়া উচিত নয়।

আমার সন্দেহ হয় যে কেউ দুর্ঘটনাক্রমে কিছু বড় ফাইল (ভিডিও, চিত্র, ইত্যাদি) প্রতিশ্রুতিবদ্ধ করেছে এবং তারপরে সেগুলি সরিয়ে ফেলেছে ... তবে গিট থেকে নয়, সুতরাং ইতিহাসটিতে এখনও অকেজো বড় ফাইল রয়েছে। গিট ইতিহাসে বড় ফাইলগুলি কীভাবে খুঁজে পাবে? এখানে 400+ কমিট রয়েছে, সুতরাং এক-এক করে যাওয়া বাস্তব নয় is

দ্রষ্টব্য : আমার প্রশ্নটি ফাইলটি কীভাবে সরিয়ে নেওয়া যায় তা নয় , তবে কীভাবে এটি প্রথম স্থানে পাবেন।



উত্তর:


143

আমি এই স্ক্রিপ্টটি অতীতে গিট সংগ্রহস্থলে বড় (এবং অ-স্পষ্ট) অবজেক্টগুলি সন্ধানের জন্য খুব দরকারী বলে খুঁজে পেয়েছি:


#!/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) দেবে এবং তারপরে আপনি এটির মতো একটি স্ক্রিপ্ট ব্যবহার করতে পারেন:

... সেই প্রতিশ্রুতি সন্ধান করতে যা এই প্রতিটি ব্লকের প্রতি নির্দেশ করে।


31
এই উত্তরটি সত্যিই সহায়ক ছিল, কারণ এটি আমাকে উপরের পোস্টে পাঠিয়েছে। পোস্টটির স্ক্রিপ্টটি কাজ করার সময়, আমি এটি বেদনাদায়কভাবে ধীর পেয়েছি। সুতরাং আমি এটি পুনরায় লিখেছি এবং এটি এখন বড় সংগ্রহস্থলগুলিতে উল্লেখযোগ্যভাবে দ্রুত। একবার দেখুন: gist.github.com/nk9/b150542ef72abc7974cb
নিক কে 9

7
আপনার উত্তরগুলিতে সম্পূর্ণ নির্দেশাবলী অন্তর্ভুক্ত করুন এবং কেবল অফসাইট লিঙ্ক নয়; Stubbism.wordpress.com অনিবার্যভাবে এহকে নামলে আমরা কী করব?
থারস্মমনার

@ নিক কে 9 আকর্ষণীয়ভাবে আমি আপনার স্ক্রিপ্ট এবং অন্যটি থেকে আলাদা আউটপুট পাই। এমন একগুচ্ছ বড় জিনিস রয়েছে যা আপনার মনে হচ্ছে। আমি কি অনুপস্থিত কিছু আছে?
আপএন্ডএডাম

ওহ ঠান্ডা! আমার স্ক্রিপ্টটি দ্রুত @ নিক \ কে 9 তৈরি করার জন্য ধন্যবাদ: ডি @ ইউপিএন্ডএডাম, আপনি কি বলছেন আমার স্ক্রিপ্টটি ভুল আউটপুট তৈরি করেছে?
অ্যান্টনি স্টাবস

1
এই মন্তব্যগুলি এটিকে শোনায় যে আমরা বাইট আকারে রিপোর্ট করছি তবে আমি কিলোবাইট পাই।
কাট

680

🚀 একটি নির্লজ্জভাবে দ্রুত শেল ওয়ান-লাইনার 🚀

এই শেল স্ক্রিপ্টটি ছোট থেকে বড় পর্যন্ত বাছাই করা সংগ্রহস্থলের সমস্ত ব্লব অবজেক্ট প্রদর্শন করে।

আমার নমুনা রেপোর জন্য, এটি এখানে পাওয়া অন্যান্যগুলির চেয়ে প্রায় 100 গুণ দ্রুত গতিতে চলেছে ।
আমার বিশ্বস্ত অ্যাথলন ২ য় এক্স 4 সিস্টেমটিতে এটি লিনাক্স কার্নেল সংগ্রহস্থলটি কেবল এক মিনিটের মধ্যে তার 5.6 মিলিয়ন অবজেক্টের সাথে পরিচালনা করে ।

বেস স্ক্রিপ্ট

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

ম্যাকোস ব্যবহারকারীরা : যেহেতু numfmtম্যাকোএসে উপলভ্য নয়, আপনি হয় শেষ লাইনটি বাদ দিতে পারেন এবং কাঁচা বাইট আকারের সাথে ডিল করতে পারেন বা brew install coreutils

ফিল্টারিং

অর্জন আরও ফিল্টারিং , নিম্নলিখিত পংক্তিগুলি কোন সন্নিবেশ সামনে sortলাইন

করার ফাইল উপস্থিত অগ্রাহ্যHEAD নিম্নলিখিত লাইন সন্নিবেশ:

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

করতে শুধুমাত্র দেওয়া আকার মাত্রাধিক ফাইল দেখান (যেমন 1 MiB = 2 20  বি), নিম্নলিখিত লাইন সন্নিবেশ:

| 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
এটি কেবল আমার উর্ধ্বগতির চেয়ে বেশি প্রাপ্য! কম্পিউটার এবং মানব পাঠযোগ্য আউটপুট উভয়ই সরবরাহের জন্য বিশেষ ধন্যবাদ।
মিশেল

2
এটি অত্যন্ত দ্রুত এবং সহজেই ব্যবহারযোগ্য!
চিন

31
Mac এ ব্যবহার করতে আপনার প্রয়োজন brew install coreutilsএবং তারপর প্রতিস্থাপন cutসঙ্গে gcutএবং numfmtসঙ্গে gnumfmt
নিক মিষ্টি

2
আমাকে পুনরায় জোর দেওয়া যাক - আমি দেখা অন্যান্য সমস্ত তালিকার চেয়ে এটি অনেক দ্রুত much
শ্রীধর সারনোবাত

4
এটি একটি দারুণ গিট ওরফে তোলে :) git largeকেউ?
অ্যারাক্যাট

160

আমি ইটিএইচ জুরিখ বিভাগের পদার্থবিজ্ঞানের উইকি পৃষ্ঠায় একটি পৃষ্ঠার সমাধান খুঁজে পেয়েছি (সেই পৃষ্ঠার শেষের নিকটে)। 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 টি বড় ফাইল আপনাকে দেবে।

এছাড়াও এখন একটি অলস সমাধান পাওয়া যায়, গিটএক্সটেনশনের এখন একটি প্লাগইন রয়েছে যা এটি ইউআইতে করে (এবং পাশাপাশি ইতিহাসের পুনর্লিখনগুলিও পরিচালনা করে)।

গিট এক্সটেনশনগুলি 'বড় ফাইলগুলি সন্ধান করুন' ডায়ালগ


8
আপনি যদি একক বৃহত্তম ফাইল পেতে চান (তবে, লেজ -1 ব্যবহার করুন) one নিউলাইনগুলি আরও বড় কিছু পাওয়ার পথে আসে। আপনি 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'`
নিউলাইনগুলিকে

10
গ্রেপ: a70783fca9bfbec1ade1519a41b6cc4ee36faea0: এরকম কোনও ফাইল বা ডিরেক্টরি নেই
জোনাথন

1
: উইকি লিংক সরানো readme.phys.ethz.ch/documentation/git_advanced_hints
outsmartin

11
গিটএক্সটেনশনগুলি সন্ধান করা সোনার পাত্র এবং রংধনুটির শেষের মতো - আপনাকে ধন্যবাদ!
ckapilla

3
ফাইলগুলির আকার প্রিন্ট করে এমন কোনও এক্সটেনশনও রয়েছে?
মাইকেল 13

27

পদক্ষেপ 1 একটি পাঠ্য ফাইলে সমস্ত ফাইল SHA1 গুলি লিখুন:

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

পদক্ষেপ 2 ব্লবগুলি বৃহত্তম থেকে ক্ষুদ্রতম পর্যন্ত বাছাই করুন এবং পাঠ্য ফাইলে ফলাফল লিখুন:

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 / আকারের তথ্য পেতে উভয় পাঠ্য ফাইল একত্রিত করুন:

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 বি আপনার কাছে ফাইলের নাম বা শূন্যস্থান সম্বলিত পাথের নাম থাকলে পদক্ষেপ 3 এ এর ​​এই প্রকরণটির চেষ্টা করুন। এটি পছন্দসই কলামগুলিকে অন্তর্ভুক্ত করার cutপরিবর্তে ব্যবহার করে awk। column কলাম থেকে লাইনের শেষ পর্যন্ত স্পেস:

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;

আপনি আপনার গিট ইতিহাস থেকে কোন ফাইলগুলি সরিয়ে ফেলতে চান তা সিদ্ধান্ত নিতে এখন আপনি বিগটোসমল.txt ফাইলটি দেখতে পারেন।

পদক্ষেপ 4 অপসারণটি সম্পাদন করতে (আপনি যে ফাইলটি চিহ্নিত করেছেন সে সম্পর্কে ডেটার জন্য এটি আপনার ইতিহাসের প্রতিটি প্রতিশ্রুতি পরীক্ষা করতে চলেছে বলে এই অংশটি ধীরে ধীরে নোট করুন):

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

সূত্র

গিটের ইতিহাস থেকে বড় ফাইলগুলি সন্ধান এবং অপরিবর্তন থেকে 1-3a পদক্ষেপগুলি অনুলিপি করা হয়েছিল

সম্পাদনা

নিবন্ধটি 2017 সালের দ্বিতীয়ার্ধে কিছুটা মুছে ফেলা হয়েছে তবে ওয়েবেব্যাক মেশিনটি ব্যবহার করে এর একটি সংরক্ষণাগার অনুলিপিটি এখনও অ্যাক্সেস করা যেতে পারে ।


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
ইভান অ্যাক্যাম্প

1
@ আইয়ান, ওয়ান লাইনারের জন্য ধন্যবাদ! এটা তাদের মধ্যে ব্যবধান সহ ফাইলের নামের হ্যান্ডেল নয়, এই বলে মনে হয়: 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। নোট আপনি প্রকৃত ট্যাব অক্ষর পর প্রবেশ করতে আছে join -t'Ctrl + V <ট্যাব> সঙ্গে প্রতি geekbraindump.blogspot.ru/2009/04/unix-join-with-tabs.html
নিকোলে

2
@ নিকোলই বাশ সহ $'\t'আপনাকে একটি ট্যাব দেওয়া উচিত। echo -n $'\t' | xxd -ps->09
ইভান অ্যাক্যাম্প

1
@ আইয়ানআউক্যাম্প: আরও ভালো, টিপটির জন্য ধন্যবাদ! (খুব খারাপ আমি আগের মন্তব্যটি সম্পাদন করতে পারি না .. ওহ ভাল।)
নিকোলে

1
@ শ্রীধর-সারনোবাত নিবন্ধটি ওয়েব্যাক মেশিন দ্বারা সংরক্ষণ করা হয়েছিল! :) web.archive.org/web/20170621125743/http://www.naleid.com/blog/…
friederbluemle

18

আপনার BFG রেপো-ক্লিনার ব্যবহার করা উচিত ।

ওয়েবসাইট অনুযায়ী:

বিএফজি আপনার গিট সংগ্রহস্থলের ইতিহাস থেকে খারাপ ডেটা পরিষ্কার করার জন্য গিট-ফিল্টার-শাখার একটি সহজ, দ্রুত বিকল্প:

  • ক্রেজি বড় ফাইলগুলি সরানো হচ্ছে
  • পাসওয়ার্ড, শংসাপত্র এবং অন্যান্য ব্যক্তিগত ডেটা অপসারণ করা হচ্ছে

একটি সংগ্রহস্থলের আকার হ্রাস করার জন্য সর্বোত্তম পদ্ধতিটি হ'ল:

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
বিএফজি রেপো-ক্লিনার খুব ভাল। এটি দ্রুত আলোকিত করে এবং খুব নির্ভরযোগ্যভাবে কাজ করে।
fschmitt

30
এটি আপনাকে সবচেয়ে বড় ফাইলগুলি কীভাবে তালিকাভুক্ত করতে হবে তা বলে না।
অ্যান্ডি জে

5
এটির সাথে সমস্যা হ'ল বড় ফাইলগুলি আসলে কীগুলি মুছে ফেলা হয় তা কেবল আপনিই দেখতে পারবেন না। আমি প্রথমে শুকনো রান ছাড়া এটি করা স্বাচ্ছন্দ্য বোধ করি না যা কেবল বড় ফাইলগুলির তালিকা করে।
শ্রীধর সারনোবাত

কি করে --strip-biggest-blobs 500?
2540625

গিট এই সরঞ্জামটির পরিবর্তনগুলি প্রত্যাখ্যান করবে।
ক্রিস্টোফার

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

তালিকার সর্বশেষ এন্ট্রি আপনার গিট ইতিহাসের বৃহত্তম ফাইলকে নির্দেশ করে।

আপনি এই আউটপুটটি এই নিশ্চয়তার জন্য ব্যবহার করতে পারেন যে আপনি আপনার ইতিহাসে বিএফজি দিয়ে স্টাফ মুছে ফেলছেন না।


2
অসাধারণ!! যাইহোক, আপনার লক্ষ্য রাখতে হবে যে এই কমান্ডটি চালানোর আগে আপনাকে - এমিরর বিকল্পগুলি দিয়ে রেপো ক্লোন করতে হবে।
অ্যান্ডি জে

আমি কৌতূহলী, 1.1, 1.2, 2.3সংখ্যাগুলি কীসের জন্য?
ympostor

সংখ্যাগুলি <filenumber>.<field>সমন্বয়ের ক্রম নির্দিষ্ট করার একটি তালিকা । আরও তথ্যের জন্য man.cx/join দেখুন ।
schmijos

6

আপনি যদি উইন্ডোতে থাকেন তবে এখানে একটি পাওয়ারশেল স্ক্রিপ্ট রয়েছে যা আপনার সংগ্রহস্থলের 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 এর থেকে আলাদা উত্তর তৈরি করে, আমার সংগ্রহস্থলের বৃহত্তম ফাইলগুলির একগুচ্ছ অনুপস্থিত। এছাড়াও যখন কোনও বড় ফাইলটিতে প্রচুর পরিবর্তন ঘটে থাকে তবে কেবল বৃহত্তম আকারের প্রতিবেদন করা হয়।
ক্রিশ্চিয়ানপ

এই স্ক্রিপ্টটি আমার জন্য ব্যর্থ হয়েছে, ত্রুটি সহ: You cannot call a method on a null-valued expression. At line: 2 char: 1। তবে, এই উত্তরটি কাজ করেছে: stackoverflow.com/a/57793716/2441655 (এটি আরও ছোট)
ভেন্রিক্স

4

ব্যবহার করে দেখুন git ls-files | xargs du -hs --threshold=1M

আমরা আমাদের সিআই পাইপলাইনে নীচের কমান্ডটি ব্যবহার করি, এটি গিট রেপোতে কোনও বড় ফাইল পেলে এটি বন্ধ হয়ে যায়:

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কমান্ড-লাইনটি গিট 1.8.3 এ (যা আমাকে ব্যবহার করতে হবে) কোনও যুক্তি স্বীকার করে না। পরবর্তী পদক্ষেপগুলি সেন্টস 6.5 এ ব্যাশ 4.1.2 দিয়ে চেষ্টা করা হয়েছে

মূল ধারণা

গিটে, ব্লব শব্দটি কোনও ফাইলের বিষয়বস্তু বোঝায়। মনে রাখবেন যে প্রতিশ্রুতিবদ্ধ ফাইল বা পথের নামের বিষয়বস্তু পরিবর্তন করতে পারে। সুতরাং, একই ফাইলটি কমিটের উপর নির্ভর করে একটি ভিন্ন ব্লবকে উল্লেখ করতে পারে। একটি নির্দিষ্ট ফাইল ডিরেক্টরিতে হায়ারার্কির মধ্যে একটি কমিটের মধ্যে সবচেয়ে বড় হতে পারে, অন্যটিতে না হলেও। অতএব, বড় ফাইলগুলির পরিবর্তে বড় কমিটগুলি সন্ধানের প্রশ্নটি বিষয়গুলিকে সঠিক দৃষ্টিকোণে রাখে।

অধৈর্য জন্য

আকারের অবতরণ ক্রমে ব্লবগুলির তালিকা মুদ্রণের কমান্ডটি হ'ল:

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.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ব্লব হ্যাশগুলির তালিকা করে, প্রতি লাইনে একটি করে। create_db()ফাংশন সমস্ত ক্যাশে বর্তমান ডিরেক্টরির মধ্যে একটি উপ-ডিরেক্টরির মধ্যে তালিকা কমিট পরিমাণ সঞ্চয় হয়।

ওএস দ্বারা 24 ভার্চুয়াল কোর হিসাবে উপস্থাপিত দুটি ইন্টেল (আর) জিয়ন (আর) সিপিইউ E5-2620 2.00GHz প্রসেসর সহ একটি সিস্টেমে আমার পরীক্ষা-নিরীক্ষার কিছু পরিসংখ্যান:

  • রেপোতে কমিটের সংখ্যা = প্রায় ১১,০০০
  • ফাইল তৈরির গতি = 126 ফাইল / গুলি। স্ক্রিপ্ট প্রতি কমিট প্রতি একক ফাইল তৈরি করে। এটি তখনই ঘটে যখন প্রথমবারের মতো ক্যাশে তৈরি করা হবে।
  • ক্যাশে সৃষ্টি ওভারহেড = 87 এস।
  • গড় অনুসন্ধানের গতি = 522 কমিট / সেকেন্ড ক্যাশে অপ্টিমাইজেশনের ফলে চলমান সময় 80% হ্রাস পেয়েছে।

নোট করুন যে স্ক্রিপ্টটি একক থ্রেডযুক্ত। সুতরাং, যে কোনও সময়ে কেবল একটি কোর ব্যবহৃত হবে would


2

উইন্ডোজ গিটের জন্য পাওয়ারশেল সমাধান, বৃহত্তম ফাইলগুলি সন্ধান করুন:

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-repo-analysisসাহায্য করতে ব্যবহার করুন ।

আপনি বিএফজি রেপো-ক্লিনার দ্বারা উত্পাদিত বিশদ প্রতিবেদনে কিছু মান খুঁজে পেতে পারেন যা তাদের 10 এমআইবি / গুলি নেটওয়ার্ক থ্রুটপুট ব্যবহার করে ডিজিটাল মহাসাগর বিন্দুতে ক্লোন করে খুব দ্রুত চালানো যেতে পারে।


আমি মনে করি আপনার কাছে বিএফজির পরামর্শটিতে একটি দুর্দান্ত সাধারণ উত্তর রয়েছে তবে আপনি কোনও বিবরণ না দিয়ে এবং তারপরে একটি ভিন্ন তৃতীয় পক্ষের পরিষেবাটি (কোনও ব্যাখ্যা ছাড়াই) ব্যবহার করার পরামর্শ দিয়ে তা নষ্ট করে ফেলেন। আপনি এই বিএফজি ব্যবহারের একটি কমান্ড-লাইনের উদাহরণ সরবরাহ করতে কিছু পরিষ্কার করতে পারেন?
ফোর্ড

0

আমি অন্য কারও মত একই কারণে এটি পেরেছি। তবে উদ্ধৃত স্ক্রিপ্টগুলি আমার পক্ষে বেশ কার্যকর হয়নি। আমি এমন একটি তৈরি করেছি যা আমি দেখেছি তাদের আরও সংকর এবং এটি এখন এখানে বাস করে - https://gitlab.com/inorton/git-size-calc

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.