গিট: "দুর্নীতি আলগা বস্তু"


329

যখনই আমি আমার দূরবর্তী থেকে টানছি, আমি সংক্ষেপণ সম্পর্কে নিম্নলিখিত ত্রুটি পেয়েছি। আমি যখন ম্যানুয়াল সংক্ষেপণটি চালাই, তখন আমি একই পাই:

$ git gc
error: Could not read 3813783126d41a3200b35b6681357c213352ab31
fatal: bad tree object 3813783126d41a3200b35b6681357c213352ab31
error: failed to run repack

কেউ কি জানেন, সে সম্পর্কে কী করবেন?

ক্যাট-ফাইল থেকে আমি এটি পেয়েছি:

$ git cat-file -t 3813783126d41a3200b35b6681357c213352ab31
error: unable to find 3813783126d41a3200b35b6681357c213352ab31
fatal: git cat-file 3813783126d41a3200b35b6681357c213352ab31: bad file

এবং git fsck থেকে আমি এটি পেয়েছি (এটি আসলে সম্পর্কিত কিনা তা জানি না):

$ git fsck
error: inflate: data stream error (invalid distance too far back)
error: corrupt loose object '45ba4ceb93bc812ef20a6630bb27e9e0b33a012a'
fatal: loose object 45ba4ceb93bc812ef20a6630bb27e9e0b33a012a (stored in .git/objects/45/ba4ceb93bc812ef20a6630bb27e9e0b33a012a) is corrupted

কেউ আমাকে এই বুঝতে সাহায্য করতে পারেন?


আপনি কি পরের বস্তুটি দেখার চেষ্টা করেছেন (45ba4ceb93bc812ef20a6630bb27e9e0b33a012a)?
জিনতাউস মিলিয়াসকাস

4
ধন্যবাদ ... তবে কীভাবে একজন অবজেক্টের দিকে "তাকান"? এখনও Git থেকে :) নতুন
asgerhallas

2
Itgit show´ দুর্ভাগ্যক্রমে ´git fsck´ এর চেয়ে বেশি আমাকে আর কিছুই দেয় না।
asgerhallas

4
লিনাস টরভাল্ডস এই ত্রুটিটি সম্পর্কে এবং নিম্নলিখিত ফাইলগুলি সম্পর্কে ম্যানুয়ালি ব্লবগুলি পুনঃনির্মাণ করার জন্য নীচের সহায়ক নথিটি লিখেছিলেন: কীভাবে একটি দূষিত ব্লব অবজেক্টটি পুনরুদ্ধার করতে হবে একটি কলুষিত সংগ্রহস্থল ঠিক করার জন্য ব্লব অবজেক্টগুলি পুনর্গঠন করার কিছু কৌশল
উয়ে ক্লিন-কনিগ

2
আপনি গ্রহণযোগ্য উত্তর কিছু মন্তব্য, বা সম্পাদনা করতে পারেন? আমি ঠিক একই পরিস্থিতিতে আছি এবং স্বীকৃত উত্তরে "জাস্ট ওয়ার্ক টিএম" এর যথেষ্ট বিশদ রয়েছে বলে মনে হচ্ছে না, বরং তার পরিবর্তে আমাকে নিজেই বিবরণে ডুব দিতে বাধ্য করবে।
ripper234

উত্তর:


57

দেখে মনে হচ্ছে আপনার কাছে কোনও দুর্গন্ধযুক্ত গাছের জিনিস রয়েছে। আপনার অন্য কারও কাছ থেকে এটি পেতে হবে get আশা করি তাদের একটি নিরবচ্ছিন্ন সংস্করণ থাকবে।

কোন ফাইলের কী আছে তা অনুমান করে আপনি যদি অন্য কারও কাছ থেকে কোনও বৈধ সংস্করণ খুঁজে না পান তবে আপনি এটি পুনর্গঠন করতে পারেন। আপনি দেখতে চাইতে পারেন যে वस्तुগুলির তারিখ এবং সময় এর সাথে মেলে কিনা। এগুলি সম্পর্কিত ব্লব হতে পারে। আপনি সেই জিনিসগুলি থেকে গাছের কাঠামোর কাঠামোটি অনুমান করতে পারেন।

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


2
এটি একটি প্যাক ফাইলে সংরক্ষণ করা যেতে পারে। এইভাবেই গিট ডেল্টাস সংরক্ষণ করে বস্তুর স্টোরেজকে সংকুচিত করে। আলগা বস্তুগুলি এখনও কোনও প্যাকেজে নেই। প্যাক ফাইলগুলির জন্য গুগল, গিটের মধ্যে সূচী ফাইলগুলি এবং আপনার প্রয়োজন মতো গভীরভাবে ডাইভ করতে সক্ষম হওয়া উচিত।
অ্যাডাম ডিমিট্রুক

2
আপনি কি চকনের গিট স্ক্রিনকাস্টের প্রতি আপনার উত্তরে একটি লিঙ্ক সরবরাহ করতে পারেন?
এহতেশ চৌধুরী

1
git cat-file -t <SHA1>আপনি টাইপ বলতে হবে। যদি দুর্নীতিগ্রস্থ না হয়, তবে আপনি git cat-file <type> <SHA1>সামগ্রীটি দেখতে করতে পারেন (আমি এটি একটি এর জন্য ব্যবহার করেছি blob, আমি অনুমান করি এটি আপনাকে অন্যান্য ধরণের সামগ্রীও প্রদর্শন করবে))
কার্ল জি

1
এছাড়াও লিনাসের এই পোস্টে একটি পুনরুদ্ধারের প্রক্রিয়া বর্ণনা করে blob। আমি যখন এই নির্দেশাবলী অনুসরণ করেছি, তবে আমি সাফল্যের সাথে দৌড়ে গিয়েও git statusসাড়া fatal: unable to read <SHA1>পেয়েছি git hash-object -w <file>(সম্ভবত তার নির্দেশনা অনুসারে আমি সেই বস্তুর ফাইলটি সরিয়ে নিয়ে এসেছি it এটিকে ফিরে আসা আমাকে একই corrupt loose objectত্রুটি দিয়েছে gave )
কার্ল জি

2
এবং এখন ইংরেজিতে পুনরাবৃত্তি করুন
মেহেদি

359

আমারও একই সমস্যা ছিল (কেন জানি না)।

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

তবে এর কিছু ত্রুটি রয়েছে:

  • আপনি যে কোনও প্রতিশ্রুতি রোধ করেননি যেগুলি ধাক্কা দেয় নি, আপনি হারাবেন এবং সেগুলি পুনরায় ফিরিয়ে দিতে হবে।
  • আপনি কোনও স্ট্যাশ হারিয়ে ফেলবেন।

ঠিক করা

আপনার রেপোর উপরে অভিভাবক ডিরেক্টরি থেকে এই আদেশগুলি কার্যকর করুন (আপনার প্রকল্প ফোল্ডারের নামের সাথে 'foo' প্রতিস্থাপন করুন):

  1. দূষিত ডিরেক্টরিটির একটি ব্যাকআপ তৈরি করুন:
    cp -R foo foo-backup
  2. নতুন ডিরেক্টরিতে রিমোট রিপোজিটরির একটি নতুন ক্লোন তৈরি করুন:
    git clone git@www.mydomain.de:foo foo-newclone
  3. দূষিত .git উপ-ডিরেক্টরি মুছুন:
    rm -rf foo/.git
  4. সদ্য ক্লোন করা .git উপ-ডিরেক্টরিকে foo এ সরান:
    mv foo-newclone/.git foo
  5. অস্থায়ী নতুন ক্লোনটি মুছুন:
    rm -rf foo-newclone

উইন্ডোজ এ আপনার ব্যবহার করতে হবে:

  • copy পরিবর্তে cp -R
  • rmdir /S পরিবর্তে rm -rf
  • move পরিবর্তে mv

এখন foo এর আসল .gitউপ-ডিরেক্টরিটি ফিরে এসেছে তবে স্থানীয় সমস্ত পরিবর্তন এখনও আছে। git status, commit, pull, push, ইত্যাদি হিসাবে তারা উচিত আবার হবে।


11
এই পদ্ধতিটি আমার পক্ষে কাজ করেছিল। যাইহোক, আমি বিশ্বাস করি যে সমস্ত চাপ ছাড়ানো কমিটগুলি হারিয়েছিল। রেপো ডেটা অচ্ছুত ছিল।
wonton

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

7
সরল ও সোজা। এটি হ'ল আইএমও, সবচেয়ে কার্যকর সমাধান যদি আপনি গিট সম্পর্কে সমস্ত কিছু বুঝতে না পারেন এবং আপনি আপনার সংগ্রহশালাটি নিয়ে ভাঁজ করতে চান না।
অলিবোয় 50

4
আমি মনে করি এটি সমস্ত স্ট্যাশগুলি মুছে ফেলবে যেহেতু সেগুলি .git উপ-ডিরেক্টরিতে সঞ্চিত রয়েছে।
অ্যান্থনি এলিয়ট

4
প্রকল্পে সাবমডিউলগুলির ক্ষেত্রে, .gitফোল্ডারটি পুনরুদ্ধার করার আগে সেগুলি শুরু করা দরকার ।
অ্যাডরিয়ানখিস্বে

241

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

প্রথমে আপনার স্থানীয় ফাইলগুলির একটি ব্যাকআপ কপি তৈরি করুন। তারপরে আপনার কার্যকারী গাছের গোড়া থেকে এটি করুন:

rm -fr .git
git init
git remote add origin [your-git-remote-url]
git fetch
git reset --mixed origin/master
git branch --set-upstream-to=origin/master master  

তারপরে যে কোনও পরিবর্তিত ফাইলগুলি প্রয়োজনীয় হিসাবে কমিট করুন।


12
আইএমএইচও এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। রেপো মোছা এবং পুনরায় ক্লোনিংয়ের চেয়ে অনেক সহজ! :) যদিও আপনি কোনও
নিক

6
স্পষ্টতই, দুর্নীতি হওয়ার সময় আপনি মাস্টার ব্যতীত অন্য কোনও শাখায় থাকলে masterআপনার শাখার নামটি প্রতিস্থাপন করুন ।
টিমোথি জর্ন

বেশিরভাগই যেমনটি ছিল তেমনভাবে কাজ করেছে, তবে আমি workingযখন অন্য একটি শাখায় ছিল তখন এটি দূষিত হয়েছিল এবং এই পদক্ষেপগুলি আমাকে মাস্টার ব্যতীত অন্য কোনও শাখার স্থানীয় কপি দেয় নি (এবং হ্যাঁ আমি উপরের সাথে মাস্টারকে প্রতিস্থাপনের চেষ্টা করেছি workingকিন্তু এটি কার্যকর হয়নি)। উপরের পদক্ষেপগুলি দিয়ে শেষ হয়ে গেছে master, তারপরে আমার পরিবর্তনগুলি পর্যালোচনা করে এবং checkout -b working origin/workingসেখানে স্ট্যাশটি পপিং করছে । মনে হয়েছে কাজ করেছে - ধন্যবাদ!
চমত্কার

1
আমার সংগ্রহশালার একটি সাবমডিউল ছিল যা দুর্নীতিগ্রস্থ ছিল না। এই প্রক্রিয়া সংগ্রহস্থলের এবং একটি রাষ্ট্র যেখানে যেমন কমান্ড হিসাবে তার submodule বাম git statusহল fatal: Not a git repository: submodules/my-sub/../../.git/modules/my-sub। ফাইল সিস্টেম থেকে সাবমডিউলটি মোছা এবং প্রক্রিয়া পুনরায় চালু করা পুনরুদ্ধার হওয়া স্বাভাবিকতা। সম্ভবত সাবমডিয়ুলগুলিতে কোনও আন-পুশ চেঞ্জসেট নেই তা নিশ্চিত করা প্রথমে একটি ভাল ধারণা ...
স্টিভেন বাল্ডস্টি

5
আমি আজ এটি করেছি এবং ফাইলগুলিতে আপত্তিহীন পরিবর্তনগুলি হারাতে পারি নি :) (গিট 2.17.1)
ডায়াস

173

একটি ভিএম নিয়ে কাজ করা, আমার নোটবুকে, ব্যাটারি মারা গেছে, এই ত্রুটিটি পেয়েছে;

ত্রুটি: অবজেক্ট ফাইল .git / অবজেক্টস / সিআর / দ্যারিফ খালি ত্রুটি: অবজেক্ট ফাইল .git / অবজেক্টস / সিই / দ্যারিফ খালি মারাত্মক: লুজ অবজেক্ট দ্যারিফ (.git / অবজেক্টস / সিআর / দ্যারিফের মধ্যে সংরক্ষিত) দূষিত

আমি কেবল 2 টি কমান্ড দিয়ে এবং আমার কাজ না করে (পুনর্নির্দিষ্ট ফাইল / অনির্ধারিত পরিবর্তনগুলি) নিয়ে পুনরায় কাজ করতে সক্ষম হয়েছি

find .git/objects/ -size 0 -exec rm -f {} \;
git fetch origin

এর পরে আমি একটি চালিয়ে গেলাম git status, রেপো ঠিক ছিল এবং আমার পরিবর্তনগুলি ছিল (প্রতিশ্রুতিবদ্ধ হওয়ার অপেক্ষায়, এখন এটি করুন ..)।

গিট সংস্করণ 1.9.1

আপনার মনে আছে এমন সমস্ত পরিবর্তন ব্যাকআপ করার কথা মনে রাখবেন, কেবলমাত্র যদি সমাধানটি কার্যকর না হয় এবং আরও মূলগত পদ্ধতির প্রয়োজন হয়।


10
find .git/objects/ -size 0 -exec rm -f {} \;আমার জন্য কাজ করে;)
লাজারো ফার্নান্দিস লিমা সুলেমান

একই সমস্যা ছিল, কমান্ডটি চালিয়েছিল, মিন্ট ভিএম-এ আমার জন্য পুরোপুরি কাজ করেছিল worked
লুডভিগ রিডাহল

অন্য কিছু না করে নিখুঁতভাবে কাজ করেছেন।
হালসফর

1
কোনও ভিএম-তে নয় এবং এটি আমার জন্য অনেকবার কাজ করেছে। আইডিকে কেন এটি আমার বর্তমান প্রকল্পে ঘটে চলেছে, তবে এটি প্রতিবারই এটি সংশোধন করে।
জেমস এল।

7
git symbolic-ref HEAD refs/heads/master.আপনার খালি জিনিসগুলি মোছার পরে চালানোর দরকার হতে পারে ।
স্টিফান

43

আমি যখন একটি প্রতিশ্রুতি বার্তা লিখছিলাম তখন আমার কম্পিউটার ক্র্যাশ হয়েছিল। রিবুট করার পরে, কাজের গাছটি যেমন ছিল আমি রেখেছিলাম এবং আমি সফলভাবে আমার পরিবর্তনগুলি সম্পাদন করতে সক্ষম হয়েছি।

যাইহোক, আমি চালানোর চেষ্টা করার সময় git statusআমি পেয়েছিলাম

error: object file .git/objects/xx/12345 is empty
fatal: loose object xx12345 (stored in .git/objects/xx/12345 is corrupt

অন্যান্য উত্তরগুলির চেয়ে পৃথক, আমি কোনও তথ্য পুনরুদ্ধার করার চেষ্টা করছিলাম না । খালি অবজেক্ট ফাইল সম্পর্কে অভিযোগ করা বন্ধ করার জন্য আমার কেবল গিটের দরকার ছিল।

সংক্ষিপ্ত বিবরণ

"অবজেক্ট ফাইল" হ'ল গিটের হ্যাশ হ্যাশ প্রতিনিধিত্ব যা আপনার পক্ষে যত্ন নেওয়া উচিত। গিট মনে করে যে এটিতে some/file.whateverসঞ্চিত হ্যাশ সংস্করণ থাকা উচিত .git/object/xx/12345এবং ত্রুটিটি সমাধান করা বেশিরভাগ ক্ষেত্রে "আলগা বস্তু" কোন ফাইলটি উপস্থাপন করার কথা ছিল তা নির্ধারণের বিষয় হতে পারে।

বিস্তারিত

সম্ভাব্য বিকল্পগুলি মনে হয়েছিল

  1. খালি ফাইলটি মুছুন
  2. গিটের কাছে গ্রহণযোগ্যতার সাথে ফাইলটি পান

পদ্ধতির 1: অবজেক্ট ফাইলটি সরান

প্রথম জিনিসটি আমি চেষ্টা করেছি কেবলমাত্র বস্তুর ফাইলটি সরানো

mv .git/objects/xx/12345 ..

এটি কাজ করে না - গিট একটি ভাঙা লিঙ্ক সম্পর্কে অভিযোগ করা শুরু করে। অন ​​অ্যাপ্রোচ 2।

পদ্ধতির 2: ফাইলটি ঠিক করুন

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

$> # Find out which file the blob object refers to
$> git fsck
broken link from    tree 2d9263c6d23595e7cb2a21e5ebbb53655278dff8
           to    blob xx12345
missing blob xx12345

$> git ls-tree 2d926
...
10064 blob xx12345  your_file.whatever

এটি আপনাকে জানায় যে ফাঁকা বস্তুটি হ্যাশ হওয়ার কথা বলে কোন ফাইলটি। এখন আপনি এটি মেরামত করতে পারেন।

$> git hash-object -w path/to/your_file.whatever

এটি করার পরে আমি পরীক্ষা করেছিলাম .git/objects/xx/12345, এটি আর খালি নেই, এবং গিট অভিযোগ করা বন্ধ করে দিয়েছে।


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

13

চেষ্টা

git stash

এটি আমার পক্ষে কাজ করেছে। এটি আপনার প্রতিশ্রুতিবদ্ধ না এমন কোনও কিছুকে স্ট্যাশ করে এবং এটি সমস্যাটি ঘিরে।


অদ্ভুত!?! আজ সকালে এই ত্রুটিটি পেরিয়ে এসেছিল। গতকাল প্রতিশ্রুতিবদ্ধ হয়েছিল, তাই কোনও আপত্তিহীন পরিবর্তন হয়নি। নিম্নলিখিতগুলি করেছেন: git stash ... মারাত্মক: '/ হোম / <ইউজার> /.git/index.lock' তৈরি করতে অক্ষম: ইনপুট / আউটপুট ত্রুটি touch .git/a স্পর্শ: '.git / a' টাচ করতে পারে না: ইনপুট / আউটপুট ত্রুটি sudo touch /home/guest/.git/a কোনও ত্রুটি git stash নয় স্থানীয় পরিবর্তনগুলি সংরক্ষণ করুন git status ... প্রতিশ্রুতিবদ্ধ হওয়ার মতো কিছুই নেই, ডিরেক্টরি ডিরেক্টরি পরিষ্কার করুন
go2null

1
@ go2null আমি এতে কিছুটা দেরি করেছি তবে ইনপুট / আউটপুট ত্রুটিগুলি সাধারণত হার্ড ড্রাইভের সমস্যা বোঝায়। যদিও আমি নিশ্চিত যে আপনি এটি এখনই খুঁজে পেয়েছেন।
আর্লেসলি

"বর্তমান সূচী রাষ্ট্রটি সংরক্ষণ করা যায় না"
ভ্লাদিমির ব্রাসিল

9

একটি আবর্জনা সংগ্রহ আমার সমস্যার সমাধান করে:

git gc --aggressive --prune=now

সম্পূর্ণ করতে কিছুটা সময় নেয় তবে প্রতিটি আলগা বস্তু এবং / অথবা দূষিত সূচি স্থির হয়েছিল।


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

"রিফ্লগ চালাতে ব্যর্থ"
ভ্লাদিমির ব্রাসিল

5

git pruneআমার জন্য কেবল এই সমস্যাটি স্থির করে চলছে


এটি আমার পক্ষে কাজ করেছে এবং সবচেয়ে সহজ সমাধান বলে মনে হচ্ছে। নিশ্চিত নয় কেন এই উত্তরটি বেশি ভোট পেল না। একমাত্র ত্রুটিটি হ'ল পরেরটি git pullস্বাভাবিকের চেয়ে কিছুটা বেশি সময় নেয়, আমার ধারণা। কারণ এটি কিছু সরানো বস্তু বা কোনও কিছুর প্রতিস্থাপন করছে।
স্টিভ

1
কারণ হতে পারে যে গিট ছাঁটাই সমস্যাটি মোটেও সমাধান করে না।
ব্যবহারকারী 3072843

4

আমি কেবল এটিই অনুভব করেছি - গিট রেপোতে লেখা অবস্থায় আমার মেশিন ক্র্যাশ হয়ে গেছে এবং এটি দূষিত হয়ে গেছে। আমি নিম্নলিখিত হিসাবে এটি স্থির।

আমি কতটা প্রতিশ্রুতি রিমোট রেপোতে ঠেলাতে পারি নি তা এইভাবে শুরু করেছিলাম:

gitk &

আপনি যদি এই সরঞ্জামটি ব্যবহার না করেন তবে এটি খুব সহজ - যতটা আমি জানি সমস্ত অপারেটিং সিস্টেমে উপলব্ধ। এটি ইঙ্গিত করে যে আমার দূরবর্তীটিতে দুটি কমিট অনুপস্থিত ছিল। অতএব আমি লেশটি ক্লিক করে সর্বশেষ দূরবর্তী প্রতিশ্রুতি নির্দেশ করে (সাধারণত এটি হবে /remotes/origin/master) হ্যাশটি পেতে (হ্যাশটি 40 অক্ষর দীর্ঘ, তবে সংক্ষিপ্ততার জন্য আমি এখানে 10 ব্যবহার করছি - এটি সাধারণত যেভাবে কাজ করে)।

এটা এখানে:

14c0fcc9b3

আমি তারপরে নিম্নলিখিত প্রতিশ্রুতিতে ক্লিক করুন (যেমন প্রথমটি যা রিমোটের নেই) এবং হ্যাশটি সেখানে পেয়েছি:

04d44c3298

আমি এই দুটিই এই প্রতিশ্রুতির জন্য প্যাচ তৈরি করতে ব্যবহার করি:

git diff 14c0fcc9b3 04d44c3298 > 1.patch

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

git diff 04d44c3298 fc1d4b0df7 > 2.patch

আমি তখন একটি নতুন ডিরেক্টরিতে চলে এসেছি, রিমোট থেকে রেপো ক্লোন করেছি:

git clone git@github.com:username/repo.git

আমি তখন প্যাচ ফাইলগুলি নতুন ফোল্ডারে সরিয়ে নিয়েছি এবং প্রয়োগ করেছি এবং তাদের যথাযথ প্রতিশ্রুতি বার্তাগুলির সাথে প্রতিশ্রুতিবদ্ধ করেছি (এগুলি উইন্ডো থেকে git logবা পেস্ট করা যেতে পারে gitk):

patch -p1 < 1.patch
git commit

patch -p1 < 2.patch
git commit

এটি আমার জন্য পুনরুদ্ধার করা জিনিসগুলি (এবং নোট করুন যে এটি প্রচুর সংখ্যক কমিটের জন্য করার একটি দ্রুত উপায় আছে)। তবে আমি এটি দেখতে আগ্রহী ছিলাম যে দুর্নীতিগ্রস্ত রেপোতে গাছটি মেরামত করা যায় কিনা, এবং উত্তরটি এটি পারে। উপরের মতো মেরামত করা রেপো সহ, ভাঙ্গা ফোল্ডারে এই কমান্ডটি চালান:

git fsck 

আপনি এরকম কিছু পাবেন:

error: object file .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d is empty
error: unable to find ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
error: sha1 mismatch ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d

মেরামতটি করতে, আমি ভাঙা ফোল্ডারে এটি করব:

rm .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
cp ../good-repo/.git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d

অর্থাৎ দূষিত ফাইলটি সরান এবং এটি একটি ভাল ফাইলের সাথে প্রতিস্থাপন করুন। আপনি এই বেশ কয়েকবার কাজ করতে হতে পারে। অবশেষে একটি পয়েন্ট থাকবে যেখানে আপনি fsckত্রুটি ছাড়াই চালাতে পারবেন । প্রতিবেদনে সম্ভবত আপনার "ঝুঁকিপূর্ণ প্রতিশ্রুতি" এবং "ঝুঁকিপূর্ণ ব্লব" লাইন থাকবে, এগুলি এই ফোল্ডারে আপনার পুনর্বাসনা এবং সংশোধনীর ফলাফল এবং ঠিক আছে। আবর্জনা সংগ্রহকারী যথাযথ সময়ে তাদের সরিয়ে দেবে।

সুতরাং (অন্ততপক্ষে আমার ক্ষেত্রে) একটি দূষিত গাছের অর্থ এই নয় যে শৃঙ্খলাবদ্ধ কমিটগুলি হারিয়ে গেছে।


3

আমি পাশাপাশি একটি দূষিত আলগা বস্তুর ত্রুটি পাচ্ছিলাম।

./objects/x/x

আমি এটি সফলভাবে দুর্নীতিগ্রস্থ অবজেক্টের ডিরেক্টরিতে গিয়ে সমাধান করেছি। আমি দেখেছি যে অবজেক্টের জন্য বরাদ্দ করা ব্যবহারকারীরা আমার গিট ব্যবহারকারীর নয় । এটি কীভাবে হয়েছিল তা আমি জানি না, তবে আমি chown git:gitসেই ফাইলটিতে একটি চালিয়েছি এবং এটি আবার কাজ করে।

এটি কিছু লোকের সমস্যাগুলির জন্য একটি সম্ভাব্য সংশোধন হতে পারে তবে তাদের সকলেরই প্রয়োজন হয় না।


2

আমার (উইন্ডোজ) মেশিনটি নিজেকে পুনরায় চালু করার সিদ্ধান্ত নেওয়ার পরে আমি এই ত্রুটিটি পেয়েছি। ধন্যবাদ, আমার দূরবর্তী রেপো আপ টু ডেট ছিল তাই আমি সবেমাত্র একটি নতুন গিট-ক্লোন করলাম ..



2

আমি এখানে অন্যান্য পদক্ষেপের অনেকগুলি অনুসরণ করেছি; গিট ট্রি / অবজেক্টের দিকে কীভাবে তাকান এবং কী কী খুঁজে পাওয়া যায় তার লিনাসের বিবরণ বিশেষভাবে সহায়ক ছিল। গিট-গিট পুনরুদ্ধার দুর্নীতিগ্রস্থ ব্লব

তবে শেষ পর্যন্ত, আমার কাছে আমার আংশিক ডিস্ক ব্যর্থতার কারণে আলগা / দূষিত গাছের জিনিসগুলি ছিল এবং গাছের জিনিসগুলি এত সহজে পুনরুদ্ধার করা যায় না / সেই দস্তাবেজের আওতায় আসে না।

শেষ পর্যন্ত, আমি দ্বন্দ্বকে objects/<ha>/<hash>পথ git unpack-objectsথেকে সরিয়ে নিয়েছি এবং একটি প্যাক ফাইলের সাথে যুক্তিসঙ্গত আপ টু ডোন ক্লোন ব্যবহার করেছি। এটি হারিয়ে যাওয়া গাছের জিনিসগুলি পুনরুদ্ধার করতে সক্ষম হয়েছিল।

তবুও আমাকে প্রচুর ঝোলা ব্লব রেখে গেছে, যা পূর্বে সংরক্ষণাগারভুক্ত জিনিসপত্রগুলি আনপ্যাক করার একটি পার্শ্ব প্রতিক্রিয়া হতে পারে এবং অন্যান্য প্রশ্নগুলিতে এখানে সম্বোধন করা হয়েছে


2

@ User1055643 এর উত্তরে শেষ পদক্ষেপটি অনুপস্থিত:

$ rm -fr .git
$ git init
$ git remote add origin your-git-remote-url
$ git fetch
$ git reset --hard origin/master
$ git branch --set-upstream-to=origin/master master  

--set-upstream-to একটি বৈধ আর্গুমেন্ট? আমি তাই মনে করি না!
শরীফ মামুন

2
গিট শাখা (--set-upstream-to = <upstream> | -u <upstream>) [<ব্র্যাচনাম>]
এরতুউরুল আল্টনবোয়া

আপনি যদি .gitক্লোন করা প্রকল্প থেকে সরিয়ে ফেলেন এবং অনুলিপি করেন তবে রেপো কাজ করবে তবে কোনও স্থানীয় শাখা এবং স্ট্যাশ সংরক্ষণ করা হবে না।
ভ্লাদিমির ভুকানাক

1

আমাদের এখানে কেবল মামলা ছিল had এটি ঘটেছিল যে সমস্যাটি হ'ল আমাদের সাধারণ ব্যবহারকারীর পরিবর্তে দূষিত ফাইলটির মালিকানা রুট। কেউ "sudo su -" করার পরে সার্ভারে প্রতিশ্রুতিবদ্ধ হওয়ার কারণে এটি ঘটেছে।

প্রথমে এর সাথে আপনার দূষিত ফাইলটি সনাক্ত করুন:

$> git fsck --full

আপনার এই মত একটি উত্তর পাওয়া উচিত:

fatal: loose object 11b25a9d10b4144711bf616590e171a76a35c1f9 (stored in .git/objects/11/b25a9d10b4144711bf616590e171a76a35c1f9) is corrupt

দূষিত ফাইলটি যেখানে রয়েছে সেই ফোল্ডারে যান এবং একটি করুন:

$> ls -la

দূষিত ফাইলটির মালিকানা পরীক্ষা করুন। যদি এটি আলাদা হয় তবে কেবল আপনার রেপোর গোড়ায় ফিরে যান এবং একটি করুন:

$> sudo chown -R YOURCORRECTUSER:www-data .git/

আশা করি এটা সাহায্য করবে!


1

আমার কাছে এটি করার সময় পাওয়ার ব্যর্থতার কারণে এটি ঘটেছিল git push

বার্তাগুলি এই রকম দেখাচ্ছে:

$ git status
error: object file .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74 is empty
error: object file .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74 is empty
fatal: loose object c238824eb3fb602edc2c49fccb535f9e53951c74 (stored in .git/objects/c2/38824eb3fb602edc2c49fccb535f9e53951c74) is corrupt

আমি এর মতো জিনিস চেষ্টা করেছিলাম git fsckকিন্তু তাতে কোন লাভ হয়নি। যেহেতু একটি ক্র্যাশ ঘটেছিল git push, যেহেতু এটি ক্লায়েন্টের পক্ষ থেকে পুনর্লিখনের সময় ঘটেছিল যা সার্ভার আপডেট হওয়ার পরে ঘটে। আমি চারপাশে তাকিয়ে দেখলাম যে c2388আমার ক্ষেত্রে এটি একটি প্রতিশ্রুতিবদ্ধ বস্তু ছিল, কারণ এটি এন্ট্রি দ্বারা উল্লেখ করা হয়েছিল .git/refs। সুতরাং আমি জানতাম যে আমি c2388যখন ইতিহাসটি দেখি (কোনও ওয়েব ইন্টারফেস বা দ্বিতীয় ক্লোনটির মাধ্যমে) আমি সন্ধান করতে সক্ষম হব ।

দ্বিতীয় ক্লোনটিতে আমি git log -n 2 c2388পূর্বসূরিকে সনাক্ত করতে একটি করেছি c2388। তারপরে আমি ম্যানুয়ালি সংশোধন করেছি .git/refs/heads/masterএবং পরিবর্তে এর .git/refs/remotes/origin/masterপূর্বসূরি c2388হতে পারি c2388। তারপর আমি একটি করতে পারে git fetchgit fetchখালি বস্তুর উপর বিবাদগুলির জন্য কয়েক বার ব্যর্থ হয়েছে। git fetchসফল না হওয়া পর্যন্ত আমি এই প্রতিটি খালি জিনিস অপসারণ করেছি । এটি ভান্ডার নিরাময় করেছে।


1

আমি এইভাবে সমাধান করেছি: আমি ব্যাকআপের ক্লোন থেকে অনাবৃত অবজেক্ট ফাইলটি কেবল আমার মূল সংগ্রহস্থলে অনুলিপি করার সিদ্ধান্ত নিয়েছি। এটি ঠিক পাশাপাশি কাজ করেছে। (উপায়ে: আপনি যদি নিজের নামে গিট / অবজেক্ট / এর নামে বস্তুটি না খুঁজে পান তবে স্থান সংরক্ষণের জন্য এটি সম্ভবত [প্যাকড] [প্যাক] করা হয়েছে))


0

আমার বেয়ার রিমোট গিট রেপোতেও আমার একই সমস্যা ছিল। অনেক সমস্যার সমাধানের পরে, আমি আমার এক সহকর্মীর কাছে একটি প্রতিশ্রুতিবদ্ধতা বের করেছিলাম যাতে .git / অবজেক্টের কিছু ফাইলের 444 (r - r -----) এর পরিবর্তে 440 (r - r -----) এর অনুমতি ছিল commit -)। সহকর্মীকে বেয়ার গিট রেপোর ভিতরে "chmod 444 -R অবজেক্টস" দিয়ে অনুমতিগুলি পরিবর্তন করতে বলার পরে, সমস্যাটি ঠিক করা হয়েছিল।


0

আমার ঠিক এইরকম সমস্যা হয়েছিল। আমার বিশেষ সমস্যাটি এমন একটি সিস্টেম ক্র্যাশের কারণে ঘটেছিল যা সর্বাধিক সাম্প্রতিক প্রতিশ্রুতি (এবং তাই এটিও মাস্টার শাখা) দূষিত করে। আমি ধাক্কা দিইনি, এবং সেই প্রতিশ্রুতিটি পুনরায় তৈরি করতে চেয়েছিলাম। আমার বিশেষ ক্ষেত্রে, আমি এটি এর সাথে এটি মোকাবেলা করতে সক্ষম হয়েছিল:

  1. এর একটি ব্যাকআপ নিন .git/:rsync -a .git/ git-bak/
  2. .git/logs/HEADএকটি বৈধ প্রতিশ্রুতিবদ্ধ ID সহ শেষ লাইনটি চেক করুন এবং সন্ধান করুন। আমার জন্য এটি ছিল দ্বিতীয় সাম্প্রতিক কমিট। এটি ভাল ছিল, কারণ আমার কাছে এখনও ফাইলটির ওয়ার্কিং ডিরেক্টরি সংস্করণ ছিল এবং তাই প্রতিটি সংস্করণ আমি চাইতাম।
  3. সেই প্রতিশ্রুতিতে একটি শাখা করুন: git branch temp <commit-id>
  4. ওয়ার্কিং ডিরেক্টরিতে থাকা ফাইলগুলির সাথে ভাঙা প্রতিশ্রুতি পুনরায় করুন।
  5. git reset master temp পদক্ষেপ 2 এ আপনি যে নতুন প্রতিশ্রুতি দিয়েছেন তাতে মাস্টার শাখাটি স্থানান্তরিত করতে।
  6. git checkout masterএবং এটি দেখতে ঠিক আছে কিনা তা পরীক্ষা করুন git log
  7. git branch -d temp
  8. git fsck --full, এবং এখন fsck যে কোনও দূষিত বস্তু মুছে ফেলা নিরাপদ হওয়া উচিত।
  9. যদি এটি সমস্ত ভাল দেখায়, চাপ দেওয়ার চেষ্টা করুন। যদি এটি কাজ করে,

এটা আমার পক্ষে কাজ করেছে আমি সন্দেহ করি যে এটি একটি যুক্তিসঙ্গতভাবে সাধারণ পরিস্থিতি, যেহেতু সাম্প্রতিক প্রতিশ্রুতি সর্বাধিক দুর্নীতিগ্রস্থ হওয়ার সম্ভাবনা রয়েছে, তবে আপনি যদি আরও একটি পিছনে হেরে যান তবে আপনি সম্ভবত সতর্কতার সাথে ব্যবহার করে git cherrypickএবং এই পুনরুদ্ধারটি ব্যবহার করতে পারেন মধ্যে .git/logs/HEAD


0

যখন আমার এই সমস্যাটি ছিল আমি আমার সাম্প্রতিক পরিবর্তনগুলি ব্যাক আপ করেছিলাম (যেমন আমি জানতাম আমি কী বদলেছি) তারপরে ফাইলটি .git / লোকেশনে অভিযোগ করে মুছে ফেলা হয়েছিল। তারপর আমি একটি গিট টান। যদিও খেয়াল রাখুন, এটি আপনার পক্ষে কার্যকর নাও হতে পারে।


0

আমার সিস্টেম ক্র্যাশ হয়ে যাওয়ার পরে আমি এটির মুখোমুখি হয়েছি। আমি যা করেছি তা হ'ল:

(দয়া করে নোট করুন আপনার দুর্নীতিগ্রস্ত কমিটগুলি হারিয়ে গেছে তবে পরিবর্তনগুলি বজায় রয়েছে this এই প্রক্রিয়া শেষে আপনাকে সেই কমিটগুলি পুনরায় তৈরি করতে হতে পারে)

  • আপনার কোডটির ব্যাকআপ দিন।
  • আপনার কার্যক্ষম ডিরেক্টরিতে যান এবং .gitফোল্ডারটি মুছুন ।
  • এখন অন্য কোনও স্থানে রিমোটটি ক্লোন করুন এবং এতে .gitফোল্ডারটি অনুলিপি করুন ।
  • এটি আপনার কার্যক্ষম ডিরেক্টরিতে আটকান।
  • আপনি যেমন চান প্রতিশ্রুতিবদ্ধ।

-7

কেবল .git ফোল্ডারটি সরান এবং আবার এটি যুক্ত করুন। এই সহজ সমাধানটি আমার পক্ষে কাজ করেছিল।


3
এটি আপনার স্থানীয় সংগ্রহস্থলকে কমিয়ে দেবে ..., বরং অযাচিত পার্শ্ব-প্রতিক্রিয়া থাকতে পারে :) আপনার প্রস্তাবটি সম্পাদনা করুন এবং সেই সতর্কতা যুক্ত করুন add
ফেলিক্স

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

1
হুয়া নেলি ... একটি ট্যুইজার কাজের জন্য বাজুকা ব্যবহার করার বিষয়ে কথা বলুন।
টুনচে Göncüoğlu
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.