গিট: historicalতিহাসিক প্রতিশ্রুতি থেকে ফাইলটি কীভাবে সরিয়ে নেওয়া যায়?


113

আমি আইডি 56f06019 (উদাহরণস্বরূপ) দিয়ে প্রতিশ্রুতিবদ্ধ করেছি। সেই প্রতিশ্রুতিতে আমি দুর্ঘটনাক্রমে বড় ফাইল (50Mb) করেছিলাম। অন্য একটি কমিটে আমি একই ফাইলটি যুক্ত করি তবে সঠিক আকারে (ছোট)। এখন আমার রেপো যখন ক্লোন হয়ে যায় তখন খুব বেশি ভারী হয় :( কীভাবে আমার রেপোর আকার হ্রাস করতে রেপো ইতিহাস থেকে সেই বড় ফাইলটি সরিয়ে ফেলা যায়?


আমার ক্ষেত্রে এটি কোনও বড় ফাইল নয়, তবে একটি কনফিগারেশন ফাইল যা ডাটাবেস ক্রেডিট ধারণ করে। আমি গিট পড়ছিলাম, তখন আমি .গিটিগনোর সম্পর্কে অসচেতন ছিলাম।
রাশি


1
সম্পর্কিত সহায়তা. github.com/articles/…
ট্রেভর বয়ড স্মিথ

উত্তর:


165

প্রো গিট বইয়ের অধ্যায় 9 এর অবজেক্টগুলি সরানোর বিষয়ে একটি বিভাগ রয়েছে ।

আমাকে পদক্ষেপগুলি এখানে সংক্ষেপে রূপরেখা দিন:

git filter-branch --index-filter \
    'git rm --cached --ignore-unmatch path/to/mylarge_50mb_file' \
    --tag-name-filter cat -- --all

পূর্বে বর্ণিত রিবিজিং বিকল্পের মতো filter-branchপুনরায় লেখার কাজ। আপনি যদি ইতিহাস প্রকাশ করেন তবে আপনাকে --forceনতুন রেফগুলি চাপতে হবে।

filter-branchপদ্ধতির চেয়ে যথেষ্ট বেশি শক্তিশালী rebaseপদ্ধতির, এটা যেহেতু

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

filter-branch ব্যাকআপগুলিও রাখে, সুতরাং আপনি রেফ্লোগগুলি এবং আবর্জনা সংগ্রহের মেয়াদ শেষ না করা অবধি অবিলম্বে রেপোর আকার হ্রাস পাবে না:

rm -Rf .git/refs/original       # careful
git gc --aggressive --prune=now # danger

1
এটি লক্ষণীয় যে এটি উইন্ডোজ cmd.exe এর অধীনে কাজ করে না বলে মনে হচ্ছে। যদিও সাইগউইনের অধীনে কাজ করে মনে হচ্ছে।
ভুয়া নাম

2
আমি উপরের গিট ফিল্টার-শাখাটি একক-কোটের পরিবর্তে ডাবল-কোট ব্যবহার করে কাজ করতে পেয়েছি (উইন্ডোজ সার্ভারে 2012
সেমিডি.এক্সে

1
আমার জন্য যা কাজ করেছিল তা হ'ল এই ফিল্টার-শাখা কমান্ড লাইন। git filter-branch --force --index-filter 'git rm --ignore-unmatch --cached PathTo/MyFile/ToRemove.dll' -- fbf28b005^.. তারপরে rm --recursive --force .git/refs/originalএবং rm --recursive --force .git/logs তারপরে আমি উপরের তালিকাভুক্ত আপনার সঠিক পদক্ষেপের চেয়ে আমার জন্য এটি ব্যবহার করেছি git prune --expire now এবং git gc --aggressiveএটি আমার পক্ষে আরও ভাল কাজ করেছে। গিট প্রো বইয়ের লিঙ্কটি অমূল্য হওয়ায় এটি অন্তর্ভুক্ত করার জন্য আপনাকে ধন্যবাদ।
dacke.geo

: ফিল্টার-শাখা কমান্ড করার পর, একমাত্র উপায় আমি .git ফোল্ডারের নিচে মাপ পেতে পারে কমান্ড এখানে পাওয়া অনুসরণ করতে ছিল stackoverflow.com/questions/1904860/... Git -c gc.reflogExpire = 0 -c জিসি। reflogExpireUnreachable = 0 -c gc.rerereresolve = 0 \ -c gc.rerereunresolve = 0 -c gc.pruneExpire = now gc "$ @"
স্টিভ আর্ডিস

রেপো সঙ্কুচিত করার জন্য, আমি গিট ফিল্টার-ব্রাঞ্চ ডকটিতে তালিকাবদ্ধ কমান্ডগুলি ব্যবহার করেছি: git-scm.com/docs/…
লুডোভিক রনসিন


0

ইন্টারেক্টিভ মোডে আপনাকে গিট রিবেস করতে হবে এখানে একটি উদাহরণ দেখুন: আমি কীভাবে গিটহাবের প্রতিশ্রুতি অপসারণ করতে পারি? এবং কীভাবে পুরানো কমিটগুলি সরিয়ে ফেলা যায়

যদি আপনার প্রতিশ্রুতিটি শূন্যের দশে কম হয় তবে:

$ git rebase -i HEAD~10

আপনার ইতিহাসের সংস্করণের পরে, আপনাকে "নতুন" ইতিহাসটি +ঠেকাতে হবে , আপনাকে জোর করার জন্য যোগ করতে হবে ( পুশ বিকল্পগুলিতে রেফস্পেক দেখুন ):

$ git push origin +master

যদি অন্য লোকেরা ইতিমধ্যে আপনার ভাণ্ডারগুলিকে ক্লোন করে ফেলেছে, তবে আপনি তাদের অবহিত করবেন, কারণ আপনি কেবল ইতিহাস পরিবর্তন করেছেন।


3
এটি ইতিহাস থেকে বড় ফাইল সরিয়ে দেয় না । এছাড়াও, বল ধাক্কা ক্যানোনিকাল উপায় git push --forceবা git push -f(যা মানুষ শাখা ধাক্কা লক্ষ্য জানতে প্রয়োজন হয় না)
sehe

প্রশ্নের ভিত্তিতে, নতুন ফাইলটি হ'ল পুরানো ফাইলের মতো, একই পথ। এ কারণেই আপনি সরাসরি git rmপথে ব্যবহার করতে পারবেন না ।
Loïc d'Anterroches

2
@ তবে, আপনি যদি বিশাল ফাইলটির সাথে প্রতিশ্রুতি মুছে ফেলা একটি রিবেস করেন তবে তা ভালই হয়েছে।
ভনব্র্যান্ড

@ ভনব্রান্ড কেবল সেই শাখা থেকে যে আপনি প্রত্যাবর্তন করেছেন। আমি ধরে নিচ্ছি না যে 'থেকে' শাখাটি মুছে গেছে। তবে হ্যাঁ, আপনি যদি পুনর্বিবেচনা গাছের শাখা মুছে
ফেলেন তবে

@ এটি নিশ্চিত, আপনাকে আপত্তিজনক প্রতিশ্রুতিযুক্ত সমস্ত শাখার তাড়া করতে হবে। এটি যদি রেপোতে কিছুটা ঝোপঝাড়ের আগে হয়, আপনার অনেক কিছু পুনরায় সংগঠিত করতে হবে। তবে রিবেস এটির জন্য সরঞ্জাম।
ভনব্রান্ড

0

আমি উইন্ডোজ https://stackoverflow.com/a/8741530/8461756 এ নিম্নলিখিত উত্তরগুলি ব্যবহার করার চেষ্টা করেছি

একক উদ্ধৃতি উইন্ডোতে কাজ করে না, আপনার ডাবল উদ্ধৃতি প্রয়োজন।

নিম্নলিখিত আমার জন্য কাজ করে।

গিট ফিল্টার-শাখা - ফোর্স - ইনডেক্স-ফিল্টার "গিট আরএম - ক্যাচড --ignore-unmatch PathRelativeRepositoryRoot / bigfile.csv" - - সমস্ত

বড় ফাইলটি সরানোর পরে, আমি আমার পরিবর্তনগুলি গিথুব মাস্টারের দিকে ঠেলাতে সক্ষম হয়েছি।


0

আপনি মুছে ফেলার জন্য একটি সাধারণ কমান্ড ব্যবহার করতে পারেন

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