কীভাবে আমার গিট রেপো থেকে অব্যবহৃত ব্লবগুলি সরিয়ে ফেলবেন


124

আমার একটি গিটহাব রেপো রয়েছে যার দুটি শাখা ছিল - মাস্টার এবং রিলিজ।

রিলিজ শাখায় বাইনারি বিতরণ ফাইল রয়েছে যা খুব বড় রেপো আকারে (> 250MB) অবদান রাখছিল, তাই আমি জিনিসগুলি পরিষ্কার করার সিদ্ধান্ত নিয়েছি।

প্রথমে আমি রিমোট রিলিজ শাখাটি মুছে দিয়েছিলাম git push origin :release

তারপরে আমি স্থানীয় রিলিজ শাখাটি মুছলাম। প্রথমে আমি চেষ্টা করেছি git branch -d release, কিন্তু গিট বলেছে "ত্রুটি: শাখা 'মুক্তি' আপনার বর্তমান হেডের পূর্বপুরুষ নয়" " যা সত্য, তাই আমি git branch -D releaseএটিকে মুছে ফেলতে বাধ্য করেছিলাম।

তবে স্থানীয়ভাবে এবং গিটহাবের উভয় জায়গায় আমার সংগ্রহস্থলের আকার এখনও বিশাল was সুতরাং আমি গিট কমান্ডগুলির সাধারণ তালিকার মধ্য দিয়ে চলেছি, যেমন git gc --prune=today --aggressiveকোনও ভাগ্য ছাড়াই।

এসও 1029969 এ চার্লস বেলির নির্দেশনা অনুসরণ করে আমি বড় ব্লবগুলির জন্য এসএএএ 1 এর একটি তালিকা পেতে সক্ষম হয়েছি। এরপরে আমি ব্লবগুলি সন্ধান করতে এসও 460331 এর স্ক্রিপ্টটি ব্যবহার করেছি ... এবং পাঁচটি বৃহত্তম উপস্থিতি নেই, যদিও ছোট ছোট ব্লব পাওয়া যায়, তাই আমি জানি যে স্ক্রিপ্টটি কাজ করছে।

আমি মনে করি যে এই ব্লগগুলি রিলিজ শাখার বাইনারি, এবং সেগুলি কোনওভাবে সেই শাখাটি মোছার পরে ফেলে রাখা হয়েছিল। এগুলি থেকে মুক্তি পাওয়ার সঠিক উপায় কী?


আপনি গিতের কোন সংস্করণ ব্যবহার করছেন? এবং আপনি কি স্ট্যাকওভারফ্লো . com/ জিজ্ঞাসা / ১১১০65৯ / / / দিয়ে চেষ্টা করেছেন ?
ভোনসি

গিট সংস্করণ ১..2.২.৩ আমি জিসি এবং ডাব্লু / বিভিন্ন যুক্তি ছাঁটাই করেছি। আমি -a-d-l পুনরুদ্ধারের চেষ্টা করিনি, কেবল এটি চালিয়েছি, কোনও পরিবর্তন নেই।
kkrugler

2
নতুন তথ্য - গিটহাবের একটি নতুন ক্লোনটির আর অবৈধ ব্লক নেই এবং 250MB থেকে "কেবল" 84 এমবিতে নেমে এসেছে।
kkrugler

উত্তর:


219

... এবং আরও বিনা বাধা ছাড়াই, আমি আপনাকে "git-gc-all", এই দরকারী কমান্ডটি আপনার কাছে উপস্থাপন করতে পারি, যতক্ষণ না তারা অতিরিক্ত কনফিগার ভেরিয়েবলগুলি না আসে ততক্ষণ আপনার সমস্ত গিট আবর্জনা অপসারণের গ্যারান্টিযুক্ত :

git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunresolved=0 -c gc.pruneExpire=now gc

আপনার প্রথমে এই জাতীয় কিছু চালানোর প্রয়োজন হতে পারে ওহ প্রিয়, গিট জটিল!

git remote rm origin
rm -rf .git/refs/original/ .git/refs/remotes/ .git/*_HEAD .git/logs/
git for-each-ref --format="%(refname)" refs/original/ | xargs -n1 --no-run-if-empty git update-ref -d

আপনার কিছু ট্যাগ মুছে ফেলার দরকার হতে পারে, ধন্যবাদ জিট্রাস:

git tag | xargs git tag -d

আমি এই সমস্ত একটি স্ক্রিপ্টে রেখেছি : গিট-জিসি-অল-হিংস্র


1
মজাদার. আমার আরও সাধারণ উত্তরের একটি ভাল বিকল্প। +1
ভনসি

10
এটি আরও বেশি ভোটের দাবিদার। এটি অবশেষে অন্যান্য পদ্ধতিগুলি যে প্রচুর গিট অবজেক্ট থেকে রক্ষা পেয়েছে তা থেকে মুক্তি পেয়েছে। ধন্যবাদ!
জিন-ফিলিপ পেলিট

1
সম্মত। বাহ, আমি জানি না যে আমি সবেমাত্র কী করেছি তবে মনে হচ্ছে এটি অনেক পরিষ্কার হয়ে গেছে। এটি কী করে তা আপনি বিস্তারিতভাবে বলতে পারেন? আমার অনুভূতিটি আমার সমস্তটা পরিষ্কার হয়ে গেছে objects। এগুলি কী এবং কেন তারা (আপাতদৃষ্টিতে) অপ্রাসঙ্গিক?
রেডসান্দ্রো

1
@ রেডসান্ড্রো, যেমন আমি বুঝতে পেরেছি, এই "গিট আরএম অরিজিন", "আরএম" এবং "গিট আপডেট-রেফ-ডি" কমান্ডগুলি রিমোটগুলি এবং এর জন্য পুরানো প্রতিশ্রুতিগুলির রেফারেন্সগুলি সরিয়ে দেয়, যা আবর্জনা সংগ্রহ রোধ করতে পারে। "গিট গিসি" এর বিকল্পগুলি এটিকে বিভিন্ন পুরানো কমিটিকে ধরে না রাখার কথা বলে, অন্যথায় এটি কিছুক্ষণ তাদের ধরে রাখবে। উদাহরণস্বরূপ, gc.rereresolve "বিবাদযুক্ত সংযুক্তির রেকর্ডগুলির জন্য আপনি ইতিপূর্বে সমাধান করেছেন", ডিফল্টরূপে 60 দিনের জন্য রাখা। এই বিকল্পগুলি গিট-জিসি ম্যানপেজে রয়েছে। আমি গিটারের বিশেষজ্ঞ নই এবং এই সমস্ত জিনিসগুলি ঠিক কী করে তা জানেন না। আমি এগুলি ম্যানেজগুলি থেকে পেয়েছি এবং কমপ্লেট রেফের জন্য .git গ্রিপিং করছি।
স্যাম ওয়াটকিন্স

1
ইতিহাসের পুরানো জিনিসগুলি সহ একটি গিট অবজেক্ট হ'ল একটি সঙ্কোচিত ফাইল বা গাছ বা আপনার গিট রেপোতে প্রতিশ্রুতিবদ্ধ। গিট জিসি অনিবদ্ধ বস্তুগুলি সাফ করে। এটি এখনও আপনার বর্তমান রেপো এবং এর ইতিহাসের জন্য প্রয়োজনীয় অবজেক্টগুলিকে রাখে।
স্যাম ওয়াটকিন্স

81

এখানে বর্ণিত হিসাবে , আপনি যদি কেবলমাত্র রেফলগের মাধ্যমে রেফারেন্সযুক্ত সমস্ত কিছু স্থায়ীভাবে অপসারণ করতে চান , কেবল ব্যবহার করুন

git reflog expire --expire-unreachable=now --all
git gc --prune=now

git reflog expire --expire-unreachable=now --allঅ্যাক্সেসযোগ্য কমিটের সমস্ত উল্লেখগুলি সরিয়ে দেয় reflog

git gc --prune=now নিজেরাই কমান্ড সরিয়ে দেয়।

মনোযোগ : কেবলমাত্র git gc --prune=nowব্যবহারগুলি কার্যকর হবে না কারণ এই কমিটগুলি এখনও রিফ্লগে রেফারেন্স করা হয়। সুতরাং, রিফ্লগ সাফ করা বাধ্যতামূলক। এছাড়াও মনে রাখবেন যে আপনি যদি rerereএটি ব্যবহার করেন তবে অতিরিক্ত নির্দেশাবলী এই আদেশগুলি দ্বারা সাফ নয়। দেখুন git help rerereআরো বিস্তারিত জানার জন্য। এছাড়াও, স্থানীয় বা দূরবর্তী শাখা বা ট্যাগ দ্বারা রেফারেন্সযুক্ত যে কোনও কমিটগুলি সরানো হবে না কারণ সেগুলি গিট দ্বারা মূল্যবান ডেটা হিসাবে বিবেচিত হয়।


14
এটি কাজ করেছিল, তবে কোনওভাবে আমি প্রক্রিয়ায় আমার সংরক্ষিত স্ট্যাশগুলি হারিয়েছি (আমার ক্ষেত্রে বড় কিছু নয়, অন্যদের জন্য কেবল একটি সাবধানতা)
আম্রো

1
কেন - গুরুতর না?
জোয়েলফ্যান

2
আমি মনে করি এই উত্তরটির একটি সুস্পষ্ট সতর্কতা দরকার, পছন্দটি শীর্ষে। আমার সম্পাদনার পরামর্শটি প্রত্যাখ্যান করা হয়েছিল, কারণ আমার ধারণা কোনও মন্তব্যতে লেখকের কাছে এটি প্রস্তাব করা উচিত? দয়া করে হয় এই সম্পাদনাটি stackoverflow.com/review/suggested-edits/26023988 গ্রহণ করুন বা একটি সতর্কতা নিজের মতো যুক্ত করুন। এছাড়াও, এটি আপনার সমস্ত স্ট্যাশস ড্রপ করে । সতর্কবাণীতেও এটি স্মরণ করা উচিত!
ইনিগো

আমি গিট সংস্করণ ২.১17 এর সাথে পরীক্ষা করেছি এবং উপরের কমান্ডগুলি দ্বারা স্ট্যাশড কমিটগুলি সরানো হবে না। আপনি কি অতিরিক্ত কোনও কমান্ড চালিত না তা নিশ্চিত?
মিক্কো রেন্টালাইনেন

1
git fetch --pruneস্থানীয় ব্লবগুলি মোছার কারণে আরও আকার হ্রাস করুন।
হেক্টরপাল

33

এই এসও উত্তরে উল্লিখিত হিসাবে , git gcআসলে রেপোর আকার বাড়াতে পারে!

আরও দেখুন এই থ্রেড

এখন Git করার জন্য একটি সুরক্ষা প্রক্রিয়া হয়েছে না এখুনি যখন 'চলমান ডিলিট unreferenced বস্তু git gc
ডিফল্টরূপে অবাস্তবহীন অবজেক্টগুলি 2 সপ্তাহের জন্য রাখা হয়। এটি আপনার দুর্ঘটনাক্রমে মুছে ফেলা শাখাগুলি বা কমান্ডগুলি পুনরুদ্ধার করা বা এমন একটি জাতি এড়ানোর পক্ষে তৈরি করা যায় যেখানে সক্রিয়ভাবে তৈরি হওয়া সত্ত্বেও এখনও রেফারেন্স না পাওয়া একটি git gcসমান্তরালে চলমান একটি ' ' প্রক্রিয়া দ্বারা মুছে ফেলা যায় ।

সুতরাং প্যাকড परंतु অরক্ষিত অবজেক্টগুলিকে এই গ্রেস পিরিয়ড দেওয়ার জন্য, পুনরায় প্রক্রিয়া প্রক্রিয়াটি সেই অযৌক্তিক অবজেক্টগুলিকে প্যাকের বাইরে তাদের আলগা আকারে ঠেলে দেয় যাতে তারা বৃদ্ধ হতে পারে এবং শেষ পর্যন্ত ছাঁটাই করা যায়।
অবাস্তব হয়ে ওঠা জিনিসগুলি সাধারণত এমন অনেকগুলি নয়। 404855 অবাস্তব অবজেক্ট থাকা যথেষ্ট, এবং ক্লোন হয়ে প্রথম স্থানগুলিতে objects অবজেক্টগুলি প্রেরণ করা বোকামি এবং নেটওয়ার্ক ব্যান্ডউইদথের সম্পূর্ণ অপচয়।

যাইহোক ... আপনার সমস্যা সমাধানের জন্য, আপনাকে সেই গ্রেড পিরিয়ডটি অক্ষম করার এবং তাত্ক্ষণিক those অপ্রয়োজনীয় বিষয়গুলি থেকে মুক্তি পাওয়ার পক্ষে যুক্তি git gcদিয়ে 'চালানো দরকার --prune=now(অন্য কোনও গিট কার্যক্রম একই সময়ে সংঘটিত হয় যা কেবল তখনই নিরাপদ) একটি ওয়ার্কস্টেশন নিশ্চিত করতে সহজ হতে হবে)।

এবং বিটিডাব্লু, git gc --aggressiveপরবর্তী গিট সংস্করণ (বা ' git repack -a -f -d --window=250 --depth=250') দিয়ে ' ' ব্যবহার করে

একই থ্রেড উল্লেখ :

 git config pack.deltaCacheSize 1

এটি ডেল্টা ক্যাশের আকারকে 0 এর ডিফল্ট পরিবর্তে এক বাইটের (কার্যকরভাবে এটি অক্ষম করে) সীমাবদ্ধ করে যার অর্থ সীমাহীন means এর সাথে আমি উপরের git repackকমান্ডটি x86-64 সিস্টেমে 4 গিগাবাইট র‌্যামের সাহায্যে 4 টি থ্রেড ব্যবহার করে (এটি একটি কোয়াড কোর) সেই সংগ্রহস্থলটি পুনরায় তুলতে সক্ষম হয়েছি । যদিও আবাসিক মেমরির ব্যবহার প্রায় 3.3 গিগাবাইটে বৃদ্ধি পায়।

যদি আপনার মেশিনটি এসএমপি হয় এবং আপনার পর্যাপ্ত র্যাম না থাকে তবে আপনি কেবল থ্রেডের সংখ্যা হ্রাস করতে পারেন:

git config pack.threads 1

অতিরিক্তভাবে, আপনি আরও --window-memory argument' git repack' এর সাহায্যে মেমরির ব্যবহার সীমিত করতে পারেন ।
উদাহরণস্বরূপ, ব্যবহারের --window-memory=128Mজন্য ডেল্টা অনুসন্ধান মেমরির ব্যবহারের উপর যুক্তিসঙ্গত উপরের আবদ্ধ রাখা উচিত যদিও রেপোতে প্রচুর পরিমাণে বড় ফাইল উপস্থিত থাকলে এটি কম অনুকূল ব-দ্বীপ মিলিত হতে পারে।


ফিল্টার-শাখার সম্মুখভাগে, আপনি এই স্ক্রিপ্টটি (সতর্কতার সাথে) বিবেচনা করতে পারেন

#!/bin/bash
set -o errexit

# Author: David Underhill
# Script to permanently delete files/folders from your git repository.  To use 
# it, cd to your repository's root and then run the script with a list of paths
# you want to delete, e.g., git-delete-history path1 path2

if [ $# -eq 0 ]; then
    exit 0
fi

# make sure we're at the root of git repo
if [ ! -d .git ]; then
    echo "Error: must run this script from the root of a git repository"
    exit 1
fi

# remove all paths passed as arguments from the history of the repo
files=$@
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD

# remove the temporary history git-filter-branch otherwise leaves behind for a long time
rm -rf .git/refs/original/ && git reflog expire --all &&  git gc --aggressive --prune

filter-branchকমান্ড ব্যবহারের জন্য stackoverflow.com/questions/359424/… এছাড়াও একটি ভাল শুরু ।
ভনসি

হাই ভনসি - এনআইআইডি চেষ্টা করেছে গিট জিসি প্রুন = এখন কোনও ভাগ্য ছাড়াই। এটি সত্যিই গিট বাগের মতো দেখতে, এর মধ্যে আমি একটি শাখা মুছে ফেলার পরে স্থানীয়ভাবে অযৌক্তিক ব্লব দিয়ে জখম করেছি, তবে গিটহাব রেপোর একটি নতুন ক্লোন নেই ... তাই এটি কেবল একটি স্থানীয় রেপো সমস্যা। তবে আমার কাছে অতিরিক্ত ফাইল রয়েছে যা আমি সাফ করতে চাই, সুতরাং আপনার উপরে উল্লিখিত স্ক্রিপ্টটি দুর্দান্ত - ধন্যবাদ!
kkrugler


12

প্রতিবার আপনার হেড চললে গিটটি এটিকে ট্র্যাক করে reflog। যদি আপনি কমিটগুলি অপসারণ করেন তবে আপনার কাছে এখনও "ঝুঁকিপূর্ণ কমিটস" রয়েছে কারণ তারা এখনও still reflog30 দিনের জন্য রেফারেন্স করে । আপনি যখন দুর্ঘটনাক্রমে কমিটস মুছবেন তখন এটি সুরক্ষা-জাল।

আপনি git reflogসুনির্দিষ্ট প্রতিশ্রুতি, পুনরুদ্ধার ইত্যাদি মুছে ফেলতে কমান্ডটি ব্যবহার করতে পারেন , বা কেবলমাত্র উচ্চ স্তরের কমান্ডটি:

git gc --prune=now

5

আপনি ব্যবহার করতে পারেন git forget-blob

ব্যবহার খুব সহজ git forget-blob file-to-forget। আপনি এখানে আরও তথ্য পেতে পারেন

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

এটি আপনার ইতিহাসের সমস্ত কমিট, রিফ্লগ, ট্যাগ এবং এগুলি থেকে অদৃশ্য হয়ে যাবে

আমি প্রতিবার এবং পরে একই সমস্যায় পড়েছি এবং প্রতিবারই আমাকে এই পোস্টে এবং অন্যদের কাছে ফিরে আসতে হবে, সে কারণেই আমি প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে চালিত করেছি।

স্যাম ওয়াটকিন্সের মতো অবদানকারীদের ক্রেডিট


2

গিট-ফিল্টার-শাখা ব্যবহার করার চেষ্টা করুন - এটি বড় ব্লবগুলি সরিয়ে দেয় না, তবে এটি পুরো রেপো থেকে নির্দিষ্ট করা বড় ফাইলগুলি সরাতে পারে। আমার জন্য এটি শত এমবি থেকে 12 এমবি থেকে রেপোর আকার হ্রাস করে।


6
এখন এটি একটি ভীতিজনক কমান্ড :) আমার গিট-ফু আরও শক্তিশালী বোধ করলে আমাকে এটিকে চেষ্টা করে দেখতে হবে।
kkrugler

তুমি ওটা আবার বলতে পারো. আমি সর্বদা কোনও কমান্ড থেকে সতর্ক থাকি যা কোনও সংগ্রহস্থলের ইতিহাসকে সামাল দেয়। জিনিসগুলি খুব ভুল হয়ে যায় যখন একাধিক ব্যক্তি সেই সংগ্রহস্থল থেকে চাপ দিচ্ছেন এবং টানছেন এবং হঠাৎ একগুচ্ছ বস্তু গিটের প্রত্যাশা রয়েছে সেখানে নেই।
জোনাথন ডুমাইন

1

কখনও কখনও, "গিসি" খুব ভাল না করার কারণটি হ'ল পুরানো প্রতিশ্রুতি ভিত্তিতে অসমাপ্ত পুনর্বাসনা বা স্ট্যাশ রয়েছে।


বা পুরানো প্রতিশ্রুতিটি HEAD, ORIG_HEAD, FETCH_HEAD, রিফ্লগ বা অন্য কোনও জিনিস দ্বারা উল্লেখ করা হয় যা গিটটি স্বয়ংক্রিয়ভাবে নিশ্চিত হয় যে এটি কখনই মূল্যবান কিছু হারাবে না তা নিশ্চিত করার চেষ্টা করে। আপনি যদি সত্যিই এই সমস্তগুলি হারাতে চান তবে এটি করতে আপনাকে অতিরিক্ত মাইল যেতে হবে।
মিক্কো রেন্টালাইনেন

1

অন্য টিপ যোগ করতে, গিট জিসি ব্যবহারের আগে আপনার রিমোটগুলির অপ্রচলিত শাখাগুলি মুছতে গিট রিমোট প্রুন ব্যবহার করতে ভুলবেন না

আপনি এগুলিকে গিট শাখা দিয়ে দেখতে পারেন a

আপনি যখন গিথুব এবং কাঁটাযুক্ত সংগ্রহস্থলগুলি থেকে নিয়ে আসেন তখন এটি প্রায়শই কার্যকর ...


1

করার আগে git filter-branchএবং git gc, আপনার ট্যাগগুলি পর্যালোচনা করা উচিত যা আপনার রেপোতে উপস্থিত। অবিচ্ছিন্ন ইন্টিগ্রেশন এবং মোতায়েনের মতো জিনিসের জন্য স্বয়ংক্রিয় ট্যাগিংয়ের যে কোনও আসল সিস্টেম এই ট্যাগগুলির দ্বারা এখনও অযাচিত বস্তুগুলিকে রেফারেন্স করে তুলবে, তাই এগুলি gcসরাতে পারে না এবং রেপোর আকার এখনও এত বড় কেন আপনি এখনও ভাবছেন।

সবচেয়ে ভালো উপায় সব আন-চেয়েছিলেন কাপড় পরিত্রাণ পেতে চালানোর জন্য হয় git-filter& git gcএবং তারপর একটি নতুন খালি রেপো মাস্টার ধাক্কা। নতুন বেয়ার রেপোতে গাছ পরিষ্কার করা হবে।

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