গিট সংগ্রহস্থল থেকে অব্যবহৃত জিনিসগুলি কীভাবে সরানো যায়?


90

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

গিট কীভাবে সেই প্রতিশ্রুতিটির জন্য তৈরি করা বস্তু (গুলি) মুছে ফেলতে পারি যাতে আমার .gitডিরেক্টরিটি আবার একটি বুদ্ধিমান আকারে সঙ্কুচিত হয়?

সম্পাদনা করুন : আপনার উত্তরের জন্য ধন্যবাদ; আমি বেশ কয়েকটি সমাধান চেষ্টা করেছিলাম। কারও কাজ হয়নি। উদাহরণস্বরূপ, গিটহাবের একজন ইতিহাস থেকে ফাইলগুলি সরিয়ে নিয়েছে, তবে .gitডিরেক্টরিটির আকার হ্রাস পায়নি:

$ BADFILES=$(find test_data -type f -exec echo -n "'{}' " \;)

$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $BADFILES" HEAD
Rewrite 14ed3f41474f0a2f624a440e5a106c2768edb67b (66/66)
rm 'test_data/images/001.jpg'
[...snip...]
rm 'test_data/images/281.jpg'
Ref 'refs/heads/master' was rewritten

$ git log -p # looks nice

$ rm -rf .git/refs/original/
$ git reflog expire --all
$ git gc --aggressive --prune
Counting objects: 625, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (598/598), done.
Writing objects: 100% (625/625), done.
Total 625 (delta 351), reused 0 (delta 0)

$ du -hs .git
174M    .git
$ # still 175 MB :-(

13
মডারেটরদের জন্য কেবল একটি অনুস্মারক, এই প্রশ্নটি 100% এসওর উপর নির্ভর করে, সুপারভাইজারের নয়।
ভোনসি


এখানে উল্লেখ করা হয়েছে ( stackoverflow.com/questions/685319/... ), আপনি আপনার জিসি পর repack চেষ্টা করেছিলেন? উদাহরণস্বরূপ git-repack -aঅনুসরণ করা git-prune-packedব্লগ.ফেলিপেবলবি
12/

4
@ জোনাস: এবং যদি আপনি সমস্ত কিছু করার পরে, আপনার রেপো ক্লোন করেন? আপনি কি তখন কাঙ্ক্ষিত হ্রাসযুক্ত আকারের ক্লোন পাবেন?
ভোনসি

4
@Jonas: সব যে তুমি করেছ পরে ( filter-branch, gc, repack, ...), না, না তোমরা চোখে দেখছ উচিত কোন খারাপ সব সময়ে কমিট। এটি প্রতীক হিসাবে পরিষ্কার করা হয়নি sign
ভোনসি

উত্তর:


129

আমি এটি অন্যত্র উত্তর দিয়েছি, এবং আমি এখানে গর্বিত হওয়ায় এটি এখানে অনুলিপি করব!

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

git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 \
  -c gc.rerereresolved=0 -c gc.rerereunresolved=0 \
  -c gc.pruneExpire=now gc "$@"

--Aggressive বিকল্পটি সহায়ক হতে পারে।

দ্রষ্টব্য: এটি সমস্ত অযৌক্তিক জিনিসগুলিকে সরিয়ে ফেলবে, সুতরাং আপনি যদি পরে সিদ্ধান্ত নেন যে আপনি তাদের কিছু রাখতে চান তবে আমার কাছে কাঁদবেন না!

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

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

আমি এই সমস্ত এখানে একটি স্ক্রিপ্টে রেখেছি:

http://sam.nipl.net/b/git-gc-all-ferocious


স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ১1০৮৮০০ / in হিসাবে , আপনার কাছে আবার +1।
ভনসি

18
চমত্কার: ডি উত্তরগুলি ক্লোন করে আরও পয়েন্ট পাওয়ার জন্য আমার খারাপ পরিকল্পনা কাজ করেছে! 1%)
স্যাম ওয়াটকিন্স

হ্যাঁ! এটি কাজ করেছে, তবে আমাকে পুরো স্ক্রিপ্টটি চালাতে হয়েছিল। শুধুমাত্র gc কমান্ড চালানো (কনফিগার বিকল্পগুলির সাথে) যথেষ্ট ছিল না।
ড্যানিয়েল

4
102 মি থেকে 160 কে .. কার্যকর এবং ধ্বংসাত্মক
প্রুশওয়ান

4
স্ক্রিপ্টের জন্য অনেক ধন্যবাদ! বোনাস তথ্য: xargsঅজ্ঞাত বিকল্পের কারণে কমান্ডটি ওএস এক্সে একটি ত্রুটি তৈরি করে। সহজ সমাধান: হোমব্রিউয়ের মাধ্যমে জিএনইউ xargs ইনস্টল করুন brew install findutilsএবং এর xargsদ্বারা প্রতিস্থাপন করুন gxargs
qqilihq

26

আপনার git reflog expire --allভুল এটি মেয়াদোত্তীর্ণ সময়ের চেয়ে পুরানো রিফ্লগ এন্ট্রিগুলি সরিয়ে দেয়, যা 90 দিনের ডিফল্ট হয়। ব্যবহার git reflog expire --all --expire=now

অনুরূপ প্রশ্নের আমার উত্তরটি সত্যই কোনও ভাণ্ডার থেকে অব্যবহৃত অবজেক্টগুলিকে স্ক্রাব করার সমস্যার সাথে সম্পর্কিত।


18

1) গিট রেপো থেকে ফাইল সরান (& ফাইল সিস্টেমটি নয়):

  • git rm --cached path/to/file

2) রেপো ব্যবহার করে সঙ্কুচিত করুন:

  • git gc,

  • বা git gc --aggressive

  • বা git prune

বা এই প্রশ্নের পরামর্শ মতো উপরের সংমিশ্রণ: গিট সংগ্রহস্থলের আকার হ্রাস করুন


10

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

আপনি যদি অন্য লোকের জন্য বাইনারিটি রেপোতে উপলব্ধ রাখতে চান তবে আপনি যা চান তা করার কোনও সঠিক উপায় নেই। এটি বেশ অনেক কিছুই বা কিছুই নয়।



6

হাই!

গিটার কেবল সংগ্রহস্থলগুলি ক্লোনিং করার সময় এটির প্রয়োজন হয় কেবলমাত্র সেগুলি পায় (যদি আমি এটি সঠিকভাবে বুঝতে পারি)

সুতরাং আপনি ভুলক্রমে যুক্ত ফাইলটি মুছে ফেলার সর্বশেষ অঙ্গীকারটি সংশোধন করতে পারেন, তারপরে আপনার পরিবর্তনগুলি দূরবর্তী সংগ্রহস্থলে চাপুন (সার্ভারেও পুরানো কমিটকে ওভাররাইট করার জন্য -f বিকল্পের সাহায্যে)

তারপরে আপনি যখন সেই রেপোটির একটি নতুন ক্লোন তৈরি করেন, তখন .git ডিরেক্টরিটি বড় ফাইল (গুলি) এর আগে কমিট হওয়া উচিত small

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


5
git filter-branch --index-filter 'git rm --cached --ignore-unmatch Filename' --prune-empty -- --all

Filenameভান্ডার থেকে আপনি মুছতে চান তার জন্য পরিবর্তন করতে ভুলবেন না।



0

2020 সালে গিট-ফিল্টার-শাখার ডকুমেন্টেশন এর ব্যবহারকে নিরুৎসাহিত করে এবং গিট-ফিল্টার-রেপোর মতো বিকল্প ব্যবহার করার পরামর্শ দেয় । এটি বিএফজির পরিবর্তেও ব্যবহার করা যেতে পারে ।

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

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