.Git ফোল্ডারটি কীভাবে সঙ্কুচিত করবেন


134

আমার বর্তমান বেস প্রায় মোট আকার আছে। 200MB।

তবে আমার .git ফোল্ডারে অসাধারণ আকারের 5GB (!) রয়েছে। যেহেতু আমি আমার কাজটিকে একটি বাহ্যিক সার্ভারে ঠেলাচ্ছি, তাই আমার কোনও বড় স্থানীয় ইতিহাসের প্রয়োজন নেই ...

আমি আমার নোটবুকের কিছু জায়গা ফাঁকা করার জন্য .git ফোল্ডারটি কীভাবে সঙ্কুচিত করতে পারি? আমি কি 30 দিনেরও বেশি পুরানো সমস্ত পরিবর্তন মুছতে পারি?

যেকোন সাহায্যের জন্য অনেক ধন্যবাদ :)


2
আপনি কি আউটপুট পোস্ট করতে পারেন git count-objects -v?
সিবি বেইলি

উত্তর:


113

আপনার 30 দিনের বেশি পুরানো সমস্ত পরিবর্তন মুছবেন না (আমার মনে হয় এটি কোনওভাবেই গিটকে শোষণ করা সম্ভব তবে সত্যই সুপারিশ করা হয়নি)।

আপনি কল করতে পারেন git gc --aggressive --prune, যা আপনার ভান্ডারগুলিতে আবর্জনা সংগ্রহ এবং পুরানো অবজেক্টগুলিকে ছাঁটাই করবে। আপনার প্রায়শ বাইনারি ফাইল (সংরক্ষণাগার, চিত্র, এক্সিকিউটেবল) রয়েছে যা প্রায়শই পরিবর্তন হয়? এগুলি সাধারণত বিশাল .git ফোল্ডারগুলিতে নিয়ে যায় (মনে রাখবেন, প্রতিটি সংশোধনের জন্য গিট স্টোর স্ন্যাপশট এবং বাইনারি ফাইলগুলি খারাপভাবে সংকোচিত করে)


32
আসলে, git gc --aggressiveখারাপ অভ্যাস হিসাবে বিবেচিত হয়। এটি ব্যবহার করা ভাল git repack -a -d --depth=250 --window=250
আর্টেফ্যাক্ট 2

18
@ ক্নিটল: একেবারে। : এখানে নিজেকে লিনাস একটি বার্তা gcc.gnu.org/ml/gcc/2007-12/msg00165.html
Artefact2

3
@ আর্টেফ্যাক্ট 2: লিঙ্কটির জন্য ধন্যবাদ! আমি এটি পড়েছি এবং লিনাসটি উল্লেখ করেছে যে - উত্তেজনাপূর্ণ পুনরায় ব্যবহার করা যাবে না (ভাল) ডেল্টাস - যা এই প্রশ্নের কোনও অস্তিত্ব নেই বলে মনে হয়, কারণ সংগ্রহশালাটি বিশাল। পুনঃস্থাপনের পথে যেতে আসলে অনেক বেশি সময় লাগবে। git gc --aggressiveউইন্ডো আকারের 250 (সিএফ। ম্যানপেজ) এবং 250 এর গভীরতার (সিএফ. সোর্স কোড) কল করে ack --আগ্রগ্রেসিভ অতিরিক্ত -fপূর্ববর্তী সমস্ত ব-দ্বীপ ক্রিয়াকলাপগুলি ফেলে দেওয়ার জন্য এবং পুনরায় করাতে সুইচ যুক্ত করে
নিটল

1
গিট-রিমোট-এইচজি ব্যবহার করে আমি কেবল hg.nginx.org/nginx রেপো ( রিলেস-১.৪.০ টিপ টিপস) পরীক্ষা করে দেখেছি এবং এটি প্রায় 100MB এর একটি রেপো পেয়েছে। ব্যবহার git gc --aggressive --pruneকরে এটি 19MB এ নামিয়ে আনা হয়েছে।
লেকেনস্টেইন

15
@ আর্টেফ্যাক্ট 2 আপনার বিবৃতিটি পুরানো : পোস্টটি কত পুরানো তা নোট করুন। প্রকৃতপক্ষে, এটি পোস্ট হওয়ার পরে, মেলিং তালিকার আলোচনার ফলে এই প্রতিশ্রুতিবদ্ধ হয়েছিল: [..] সুতরাং প্যাকিং পরামিতি উভয় পদ্ধতির জন্য আজকাল একই। --pruneএটি ডিফল্ট হয়ে যাওয়ার কারণে এটিও প্রয়োজনীয় নয় v1.5.5-rc0(প্রতিশ্রুতি 25ee973 , মার্চ ২০০ 2008)।
লেকেনস্টেইন

68

গিট লিনাসের স্রষ্টা কীভাবে আপনার গিট রেপো সঙ্কুচিত করবেন সে সম্পর্কে এখানে যা বলা আছে:

"Git gc --aggressive" - ​​এর সমতুল্য - তবে * যথাযথভাবে করা * - এমন কিছু করা (রাতারাতি) করা

   git repack -a -d --depth=250 --window=250

যেখানে সেই গভীরতার জিনিসটি ডেল্টা চেইনগুলি কত গভীর হতে পারে (সেগুলি পুরানো ইতিহাসের জন্য দীর্ঘতর করুন - এটি স্পেসের ওভারহেডের পক্ষে মূল্যবান) এবং উইন্ডোটি হ'ল প্রতিটি ব-দ্বীপ প্রার্থীকে স্ক্যান করতে আমরা কতটা বড় অবজেক্ট উইন্ডোটি চাই।

এবং এখানে, আপনি ভালভাবে "-f" পতাকাটি যুক্ত করতে চান (যা "সমস্ত পুরানো ডেল্টাস ছেড়ে দিন", যেহেতু আপনি এখন এটি নিশ্চিত করার চেষ্টা করছেন যে এটি আসলে ভাল প্রার্থী খুঁজে পায়)।

উত্স: http://gcc.gnu.org/ML/gcc/2007-12/msg00165.html

এটি কি আমার রেপোতে অনাথ বাইনারি তথ্য থেকে মুক্তি পাবে? "গিট রিপ্যাক" আপনি যে চিত্র বা বাইনারি ডেটা পরীক্ষা করেছেন তা আপনার রেপোতে পরীক্ষা করে তা মুছে ফেলবে না। এই ধরণের ডেটা স্থায়ীভাবে আপনার রেপো থেকে মুছতে আপনাকে আপনার ইতিহাসটি আবার লিখতে হবে। এর সাধারণ উদাহরণটি হ'ল যখন আপনি ঘটনাক্রমে গিটটিতে আপনার পাসওয়ার্ডগুলি চেক করেন। আপনি ফিরে যেতে পারেন এবং কিছু ফাইল মুছতে পারেন তবে তারপরে আপনাকে এখন থেকে আপনার ইতিহাস পুনরায় লিখতে হবে এবং তারপরে জোর করে নতুন উত্সে পুনরায় নিজের উত্সে নিয়ে যেতে হবে।


আমার জন্য .git ফোল্ডারটি প্রায় 1.5 জি। আমি এটি চেষ্টা করেছিলাম, কিন্তু আমার অনুসরণ ত্রুটি হয়েছে। fatal: Out of memory, malloc failed (tried to allocate 39763130 bytes)
মিরন

2
repackস্থানীয়ভাবে মৃত্যুদন্ড কার্যকর করার পরে , একটি প্রতিশ্রুতিবদ্ধ এবং পুশ করার পরে, সঙ্কুচিতটিও কি দূরবর্তী হয়ে যাবে?
টিমো

@ ডেভিড দেহঘান: আরে আমি প্রকল্প ডিরেক্টরি থেকে এটি চেষ্টা করেছি কিন্তু .git ফোল্ডারের আকার পরিবর্তন হয়নি। এটি কি প্রত্যাশিত, বা পরিবর্তনগুলি দেখার জন্য আমাকে ধাক্কা দেওয়া দরকার? (দুঃখিত, গিটারের সাথে খুব অভিজ্ঞ নন)) রেপোতে আমার একটি চিত্র / জিআইএফ আছে এবং আমি সেই চিত্রটির বিভিন্ন সংস্করণে বহুবার প্রতিশ্রুতিবদ্ধ করেছি এবং আমি অনুমান করি যে .git আকার বাড়িয়েছে।
জর্জিিম

হাই, দুর্ভাগ্যক্রমে এখন আপনি পুরানো বাইনারি সংস্করণটি কীভাবে পরিষ্কার করেন। এটি করার জন্য আপনাকে আপনার ইতিহাসটি আবার লিখতে হবে যা আসলে জটিল। আপনার জন্য এখানে কিছু সীসা দেওয়া হয়েছে: ডকস.মাইক্রোসফট.ইন- ইউএস
ডেভিড

22

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

স্টিভ লোরেক, কীভাবে গিট সংগ্রহস্থল সঙ্কুচিত করবেন


4
লিঙ্ক পচানোর ক্ষেত্রে এখানে সংরক্ষণাগারিত সংস্করণ । এই উত্তরটি / আমার কাছে এসেছিল এমন একটি রেপোর জন্য সহায়ক ছিল যেখানে .exe এবং .zip ফাইলগুলি প্রতিশ্রুতিবদ্ধ হয়েছিল যা .git ফোল্ডারের আকার বিকশিত করে
ডাবলডাউন

9

5 জিবি বনাম 200 এমবি এক ধরণের অদ্ভুত। চালানোর চেষ্টা করুন git gc

তবে না, যদি না আপনি নিজের সংগ্রহস্থলটিকে মডিউলগুলিতে বিভক্ত করেন, আপনি .gitডিরেক্টরিটির আকার হ্রাস করতে পারবেন না ।

গিট রেপুর প্রতিটি ক্লোন হ'ল একটি পূর্ণাঙ্গ সংগ্রহস্থল যা সার্ভার হিসাবে কাজ করতে পারে। এটি বিতরণিত সংস্করণ নিয়ন্ত্রণের মূল নীতি।


3

আমি সংস্করণ ইতিহাসের চেয়ে সিঙ্ক্রোনাইজেশন প্রক্রিয়া হিসাবে গিটটি ব্যবহার করছি। সুতরাং এই সমস্যার সমাধানটি আমার কাছে আমার বর্তমান উত্সগুলি সন্তোষজনক অবস্থায় রয়েছে তা নিশ্চিত করা এবং তারপরে .git মুছুন এবং পুনরায় শুরু করুন। ডিস্ক স্পেস সমস্যার সমাধান হয়েছে। :-) ইতিহাস চলে গেছে :-( আমি এই কাজটি করি কারণ আমার রেপো একটি ছোট্ট ইউএসবি কী-তে রয়েছে। আমি আমার পুরো ইতিহাস চাই না বা প্রয়োজন।

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


1
পরিবর্তে আপনি এই ব্যবহারের ক্ষেত্রে ড্রপবক্সটি ব্যবহার করতে পারেন। বহু বছর ধরে করেছি।
জনি 1

0

উপরোক্ত পদ্ধতির চেষ্টা করা, আমার ক্ষেত্রে কিছুই কার্যকর হয়নি (যেখানে আমি ঘটনাক্রমে গিট ধাকানোর সময় গিট প্রক্রিয়াটি মেরেছিলাম) তাই অবশেষে আমাকে রেপো মুছতে হয়েছিল এবং এটি আবার ক্লোন করতে হয়েছিল এবং এখন .git ফোল্ডারটি স্বাভাবিক আকারের।


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