গিট দ্বারা নির্মিত বড়। প্যাক ফাইল সরান


112

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

আমি ব্যবহার করে সমস্ত ফাইল মুছে ফেলেছি git rm -rf xxxxxxএবং আমি --cachedবিকল্পটিও চালিয়েছি।

কেউ আমাকে কীভাবে বলতে পারেন যে আমি বর্তমানে নীচের ডিরেক্টরিতে থাকা একটি বড়। প্যাক ফাইলটি কীভাবে সরিয়ে ফেলতে পারি:

.git/objects/pack/pack-xxxxxxxxxxxxxxxxx.pack

আমার যে শাখাটি এখনও রয়েছে সেগুলি কী সরিয়ে ফেলতে হবে? নাকি আমার চালানোর দরকার অন্য কিছু আছে?

আমি নিশ্চিত না যে এটি কতটা তফাত তৈরি করে তবে এটি ফাইলের বিরুদ্ধে প্যাডলক দেখায়।

ধন্যবাদ


সম্পাদনা

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

git add .
git commit -m "Adding my branch changes to master"
git checkout master
git merge my-branch
git rm -rf unwanted_folder/
rm -rf unwanted_folder/     (not sure why I ran this as well but I did)

আমি ভেবেছিলাম যে আমি নিম্নলিখিতগুলিও চালিয়েছি তবে এটি অন্যদের সাথে ব্যাশ_ ইতিহাসে উপস্থিত হয় না:

git rm -rf --cached unwanted_folder/

আমি আরও ভেবেছিলাম git gcযে প্যাক ফাইলটি পরিষ্কার করার চেষ্টা করার জন্য আমি কিছু গিট কমান্ড চালিয়েছি (যেমন ) তবে সেগুলি .bash_history ফাইলটিতে উপস্থিত হয় না।


আপনি কীভাবে এগুলি সরিয়েছেন তা আপনি পরিষ্কার করতে পারেন? যদি তারা এখনও প্রতিশ্রুতিবদ্ধ ইতিহাসে থাকে তবে তারা এখনও আপনার প্যাক ফাইলগুলিতে থাকবে।
লগানফস্মিথ

হাই @ লোগানফস্মিথ, আমি বাশ ইতিহাসের স্ক্রিপ্টগুলি যুক্ত করেছি যা আশা করি সহায়তা করবে।
ব্যবহারকারী 1116573

উত্তর:


201

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

আপনি যা করতে যাচ্ছেন তা পুনর্লিখনের ইতিহাস বলা হয় এবং এটি এতে জড়িত git filter-branch কমান্ড ।

গিটহাব তাদের সাইটে ইস্যুটির একটি ভাল ব্যাখ্যা রয়েছে। https://help.github.com/articles/remove-sensitive-data

আপনার প্রশ্নের আরও সরাসরি উত্তর দেওয়ার জন্য, আপনাকে মূলত যা চালানো দরকার তা হ'ল সেই আদেশটি unwanted_filename_or_folderসেই অনুযায়ী প্রতিস্থাপন করা হয়েছে:

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch unwanted_filename_or_folder' --prune-empty

এটি রেপোর সক্রিয় ইতিহাস থেকে ফাইলগুলির সমস্ত উল্লেখ মুছে ফেলবে।

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

git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
# or, for older git versions (e.g. 1.8.3.1) which don't support --stdin
# git update-ref $(git for-each-ref --format='delete %(refname)' refs/original)
git reflog expire --expire=now --all
git gc --aggressive --prune=now

3
আমি এটিকে গ্রহণযোগ্য হিসাবে চিহ্নিত করেছি যদি ভবিষ্যতে এই প্রশ্নে যে কেউ আসার পক্ষে সহজ করে তোলে যদিও আমি আসলে একটি নতুন গিট রেপো তৈরি করে আমার সমস্যার সমাধান করেছি
ব্যবহারকারীর 1116573

3
আমি জানি না আপনি কীভাবে এটিকে নিয়ে এসেছেন কিন্তু ... আপনি মানুষ। ধন্যবাদ।
এজেকিয়েল ভিক্টর

5
এই উত্তরটি আমাকে সঠিক দিকে নির্দেশ করেছে। তবে ফাইলগুলি মুছতে আসলে আরও 3 টি কমান্ডের প্রয়োজন হয় 1) git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin2) git reflog expire --expire=now --all3)git gc --prune=now
আর্ড করুন

3
আমি bfgঅনেক সহজ ব্যবহার করে । এটি অফিশিয়াল গিথুব ডক্সেও
টিমো

2
@ টিমো একটি নতুন উত্তর যুক্ত করা ভাল, যদি সময়ের সাথে জিনিসগুলি পরিবর্তিত হয়। এটার জন্য যাও!
লোগানফস্মিথ

12

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

git branch -D mybranch
git reflog expire --expire-unreachable=all --all
git gc --prune=all

পরিস্থিতি বি : তবে, আপনার বাশ ইতিহাসের উপর ভিত্তি করে দেখে মনে হচ্ছে যে আপনি পরিবর্তনগুলিকে মাস্টার করে নিয়েছেন। আপনি যদি কারও সাথে পরিবর্তনগুলি ভাগ না করে থাকেন ( git pushএখনও নেই)। সবচেয়ে সহজ বিষয় হ'ল বড় ফাইলযুক্ত শাখায় মার্জ হওয়ার আগে মাস্টারটিকে পুনরায় সেট করা। এটি আপনার শাখা থেকে সমস্ত কমিট এবং মার্জ হওয়ার পরে মাস্টার করার জন্য করা সমস্ত কমিটকে সরিয়ে দেবে। সুতরাং আপনি পরিবর্তনগুলি হারাতে পারেন - বড় ফাইলগুলি ছাড়াও - যা আপনি সম্ভবত চেয়েছিলেন:

git checkout master
git log # Find the commit hash just before the merge
git reset --hard <commit hash>

তারপরে পরিস্থিতি এ থেকে পদক্ষেপগুলি চালান A.

পরিস্থিতি সি : আপনি যে মার্জটি রাখতে চান তা শাখার থেকে অন্য পরিবর্তনগুলি বা মাস্টার পরিবর্তন করা থাকলে, মাস্টারকে রিবাজ করা এবং আপনি যে কমিটগুলি চান তা নির্বাচিতভাবে অন্তর্ভুক্ত করা ভাল:

git checkout master
git log # Find the commit hash just before the merge
git rebase -i <commit hash>

আপনার সম্পাদকটিতে, বড় ফাইলগুলি যুক্ত করার সাথে সম্পর্কিত লাইনগুলি সরিয়ে ফেলুন, তবে সমস্ত কিছু যেমন রয়েছে তেমন ছেড়ে দিন। সংরক্ষণ করুন এবং প্রস্থান করুন। আপনার মাস্টার শাখায় কেবলমাত্র যা চান তা থাকা উচিত এবং কোনও বড় ফাইল নেই। মনে রাখবেন যে git rebaseব্যতীত -pমার্জ কমিটগুলি অপসারণ করবে, সুতরাং আপনার পরে মাস্টারটির জন্য একটি রৈখিক ইতিহাস থাকবে <commit hash>। এটি সম্ভবত আপনার পক্ষে ঠিক আছে, তবে তা না হলে আপনি চেষ্টা করে দেখতে পারেন -p, তবে git help rebaseবলেছেন combining -p with the -i option explicitly is generally not a good idea unless you know what you are doing

তারপরে পরিস্থিতি এ থেকে কমান্ডগুলি চালিত করুন


পরিস্থিতি এ এর ​​একটি বৈকল্পিক এখানে আছে, তবে, একটি অতিরিক্ত অপ্রত্যাশিত সমস্যা।

পরিস্থিতি একটি বড় পরিমাণে অস্থায়ী প্যাক ফাইল মোছার জন্য খনি সমস্যার সমাধান করেছে। সংগ্রহস্থলটি একটি বিল্ড সার্ভার দ্বারা পরিচালিত হয়েছিল এবং এটি .git / অবজেক্টস / প্যাক ফোল্ডারের ভিতরে অযাচিত ফাইল তৈরির কারণ ঘটায়। আমি আমার ডিস্ক থেকে মূল্যবান জিবিগুলি মুক্ত করতে পারতাম।
xrissz

7

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

ইতিহাস থেকে ফাইলগুলি মোছা হচ্ছে

তাদের ওয়েবসাইট থেকে বিএফজি ডাউনলোড করুন । আপনি জাভা ইনস্টল করেছেন তা নিশ্চিত করুন, তারপরে একটি মিরর ক্লোন তৈরি করুন এবং ইতিহাস সাফ করুন। আপনি যে YOUR_FILE_NAMEফাইলটি মুছতে চান তার নামের সাথে প্রতিস্থাপনের বিষয়টি নিশ্চিত করুন :

git clone --mirror git://example.com/some-big-repo.git
java -jar bfg.jar --delete-files YOUR_FILE_NAME some-big-repo.git
cd some-big-repo.git
git reflog expire --expire=now --all && git gc --prune=now --aggressive
git push

একটি ফোল্ডার মুছুন

উপরের মত একই কিন্তু ব্যবহার --delete-folders

java -jar bfg.jar --delete-folders YOUR_FOLDER_NAME some-big-repo.git

অন্যান্য অপশন

বিএফজি এমনকি ফ্যানসিয়ার বিকল্পগুলির জন্যও ( ডক্স দেখুন ) অনুমতি দেয় :

ইতিহাস থেকে 100M এর চেয়ে বড় সমস্ত ফাইল সরান:

java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git

গুরুত্বপূর্ণ!

যখন BFG চলমান, উভয় যে সতর্কতা অবলম্বন করা আবশ্যক YOUR_FILE_NAMEএবং YOUR_FOLDER_NAMEপ্রকৃতপক্ষে মাত্র ফাইল / ফোল্ডার নাম। তারা পথ নয় , সুতরাং এর মতো কিছু foo/bar.jpgকাজ করবে না! পরিবর্তে নির্দিষ্ট নামযুক্ত সমস্ত ফাইল / ফোল্ডার রেপো ইতিহাস থেকে সরানো হবে, তারা কোন পাথ বা শাখার অস্তিত্বই রাখে না।


আমি ভাবছি যদি আমি এই bfgসরঞ্জামটি স্থানীয় গিট রেপোতে প্রয়োগ করতে চাই, কমান্ডটি কেমন দেখাচ্ছে?
অ্যাঞ্জেল টডোরভ

5

একটি বিকল্প:

চালান git gcএকাধিক প্যাক ফাইল এক বা কয়েকটি প্যাক ফাইলগুলিতে ঘন করতে ম্যানুয়ালি । এই ক্রিয়াকলাপটি অবিচল রয়েছে (অর্থাত্ বৃহত প্যাক ফাইলটি তার সংকোচনের আচরণ বজায় রাখবে) তাই পর্যায়ক্রমে একটি সংগ্রহস্থল সংকোচন করা উপকারী হতে পারেgit gc --aggressive

অন্য বিকল্পটি হ'ল কোড এবং .git কোথাও সংরক্ষণ করুন এবং তারপরে .git মুছে ফেলুন এবং একটি নতুন গিট সংগ্রহস্থল ( git init) তৈরি করে এই বিদ্যমান কোডটি ব্যবহার করে আবার শুরু করুন ।


হাই মাইকেল, আমি দৌড়ানোর চেষ্টা করেছি git gcএবং কেবল কয়েকটি প্যাক ফাইল নেমে এসেছি তবে বড় ফাইলটি এখনও তাদের মধ্যে একটি এবং আমি কেবল এ থেকে মুক্তি পেতে চাই যাতে আমি ফোল্ডারটিকে বাহ্যিকভাবে সহজভাবে ব্যাকআপ করতে পারি (জিপ আগে ছিল 1 -2 এমবি, এখন 55 এমবি)। অন্য কেউ কিছু না বলতে পারলে আমার মনে হয় আমাকে একটি নতুন গিট তৈরি করতে হবে। আমি ধরে নিলাম এর অর্থ আমি বর্তমানে যে শাখাগুলিতে আছি সেগুলিতে অ্যাক্সেস হারাবো ...?
ব্যবহারকারী 1116573

2
আমি চেষ্টা ছেড়ে দিলাম এবং স্রেফ .git ফোল্ডারটি মুছে ফেলেছি এবং আপনি যেমন বলেছিলেন তেমন একটি নতুন গিট সংগ্রহস্থল তৈরি করেছি। আমি এটিকে শিখানো একটি পাঠ বিবেচনা করব। ধন্যবাদ মাইকেল।
ব্যবহারকারী 1116573

4
এটি খুব একটা বোঝায় না। আপনি কেন কেবল গিটকে বর্তমান সংগ্রহস্থলকে একীভূত করতে এবং প্রক্রিয়াতে প্যাক ফাইলগুলি সরাতে পারবেন না?
জেএমএল

4

নীচের কমান্ডটি চালান, PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATAআপনি যে ফাইলটি সরাতে চান কেবল তার ফাইলের নাম নয়, পরিবর্তনের জন্য। এই যুক্তিগুলি করবে:

  1. গিটকে প্রক্রিয়া করতে বাধ্য করুন, তবে প্রতিটি শাখা এবং ট্যাগের পুরো ইতিহাস পরীক্ষা করে দেখুন না
  2. নির্দিষ্ট ফাইলটি সরান, পাশাপাশি ফলস্বরূপ যে কোনও খালি কমিট তৈরি করা হয়
  3. আপনার বিদ্যমান ট্যাগগুলি মুছে ফেলুন
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" --prune-empty --tag-name-filter cat -- --all

এটি রেপোর সক্রিয় ইতিহাস থেকে ফাইলগুলির সমস্ত উল্লেখকে দৃfully়তার সাথে মুছে ফেলবে।

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

git update-ref -d refs/original/refs/remotes/origin/master
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --aggressive --prune=now

অবশেষে ২ য় অংশ থেকে আমি একটি 28 জি রেপো পেয়ে নিলাম 158M তে। গুগলে প্রায় কোনও কিছুই কাজ করেনি। ধন্যবাদ.
শ্রীধর সারনোবাত

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

1

আমি অনুষ্ঠানের জন্য একটু দেরি করেছি তবে যদি উপরের উত্তরটি কোয়েরিটি সমাধান না করে তবে আমি আর একটি উপায় খুঁজে পেয়েছি। কেবলমাত্র প্যাক থেকে নির্দিষ্ট বড় ফাইলটি সরান। আমার এই সমস্যাটি ছিল যেখানে আমি দুর্ঘটনাক্রমে একটি বড় 2 জিবি ফাইলটিতে চেক করেছি। আমি এই লিঙ্কে বর্ণিত পদক্ষেপগুলি অনুসরণ করেছি: http://www.ducea.com/2012/02/07/howto-completely-remove-a-file-from-git-history/


এই পদ্ধতিটি করার পরে এটি প্রকল্পের পুরো ইতিহাস পুরোপুরি সরিয়ে ফেলবে, বা এটি কেবল নির্দিষ্ট ফাইলটি সরিয়ে ফেলবে।
সামিম আফতাব আহমেদ

-3

এটি কোডিংয়ের চেয়ে কার্যকর সমাধান। ফাইল জিপ করুন ফাইল ভিউ ফর্ম্যাটে জিপ খুলুন (আনজিপিং থেকে পৃথক)। .প্যাক ফাইলটি মুছুন। আনজিপ করুন এবং ফোল্ডারটি প্রতিস্থাপন করুন। একটি যাদুমন্ত্র মত কাজ করে!

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