কোনও শাখার অধীনে থাকা গিট কমিটস তালিকাবদ্ধ এবং মোছা (ঝোলা?)


146

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

আমি ভেবেছিলাম এটি ঝুঁকিপূর্ণ কমিটস / ট্রি ইস্যু (-ডি শাখার ফলস্বরূপ), তাই আমি রেপো ছাঁটাই, তবে তারপরেও আমি একই আচরণ দেখতে পাচ্ছি:

$ git fetch origin

$ git fsck --unreachable
$ git fsck

আউটপুট নেই, কিছুই ঝুঁকছে না (ডান?) কিন্তু প্রতিশ্রুতি আছে

$ git show 793db7f272ba4bbdd1e32f14410a52a412667042
commit 793db7f272ba4bbdd1e32f14410a52a412667042
Author: ...

এবং এটি কোনও শাখার মাধ্যমে পৌঁছনীয় নয়

$ git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042

কোন আউটপুট দেয় না।

সেই প্রতিশ্রুতির অবস্থা ঠিক কী? আমি কীভাবে সমস্ত কমিটকে অনুরূপ অবস্থায় তালিকাবদ্ধ করতে পারি? আমি কীভাবে এরকম কমিটগুলি মুছতে পারি?


উত্তর:


75

আউটপুট নেই, কিছুই ঝুঁকছে না (ডান?)

নোট করুন যে আপনার রিফ্লগ থেকে উল্লেখ করা কমিটগুলি অ্যাক্সেসযোগ্য হিসাবে বিবেচিত হবে।

সেই প্রতিশ্রুতির অবস্থা ঠিক কী? আমি কীভাবে সমস্ত অনুরূপ রাজ্যের সাথে প্রতিশ্রুতিগুলি তালিকাভুক্ত করতে পারি

তাদের আপনাকে দেখানোর --no-reflogsজন্য বোঝাতে পাস git fsckকরুন।

আমি কীভাবে এরকম কমিটগুলি মুছতে পারি?

আপনার রিফ্লগ এন্ট্রিগুলি মেয়াদ শেষ হয়ে গেলে, সেই জিনিসগুলি পরে পরিষ্কার করে দেওয়া হবে git gc

মেয়াদ শেষ হওয়ার নিয়ন্ত্রিত হয় gc.pruneexpire, gc.reflogexpireএবং gc.reflogexpireunreachableসেটিংস। Cf. git help config

ডিফল্ট সব বেশ যুক্তিসঙ্গত।


2
সুতরাং আপনি মূলত বলছেন যে ঝুঁকির কমিটগুলির জন্য প্রতিচ্ছবি কিছুক্ষণ পরে স্বয়ংক্রিয়ভাবে মুছে ফেলা হবে?
মোরালকোড

2
মূলত: হ্যাঁ - প্রশ্নটি বাদ দিয়ে কিছুটা বিভ্রান্ত হয়। আমি বলছি যে সমস্ত রিফ্লগ এন্ট্রি কিছুক্ষণ পরে স্বয়ংক্রিয়ভাবে সরানো হবে তবে আপনি সেটিংস কনফিগারেশন সেটিংসের মাধ্যমে পরিবর্তন করতে পারবেন। যেহেতু একটি কমিট শুধুমাত্র বলা হয় আনত যখন এটা আছে কিছুই এটি এর প্রতি নির্দেশ - reflog এন্ট্রি সহ -, "করে আনত জন্য reflogs" একটি জিনিস। তারা হবে "অ্যাক্সেস অযোগ্য কমিটের রিফ্লাগস "।
অ্যারিস্টটল পাগাল্টজিস

'তারা "অ্যাক্সেস অযোগ্য কমিটের রিফ্লাগস" হবে' ' তবে আপনি বলেছিলেন "আপনার রিফলগ থেকে উল্লেখ করা কমিটগুলি পৌঁছনীয় বলে বিবেচিত হয়" " তাহলে কীভাবে "অ্যাক্সেস অযোগ্য কমিটের জন্য পুনর্বিবেচনাগুলি" একটি জিনিস হতে পারে? আমি খুবই দ্বিধাগ্রস্ত.
LarsH

1
হ্যাঁ, আমি সামঞ্জস্য ছিল না। সাধারণত লোকেরা এই রিফ্লগ সম্পর্কে চিন্তা করে না, এবং যখন তারা "অপ্রাপ্য" বলে তখন এটি "রেফ থেকে" বোঝায়। এমনকি git help glossaryএটি সেভাবেই সংজ্ঞায়িত করা হয় ... যেখানে "পৌঁছনীয়" এর জন্য এর সংজ্ঞাটি সেভাবে সংকীর্ণ করা হয়নি, সুতরাং এগুলি পরস্পরবিরোধী। মজার - সুতরাং আমি যা বলেছিলাম তা আসলে বিভ্রান্তির সাথে সামঞ্জস্যপূর্ণ gitglossary... এটি যে ধারণাগুলি বিভ্রান্ত করছে তা নয়, যদিও এটি কেবল পরিভাষা। মুল বক্তব্যটি হ'ল "ঝাঁকুনি" কমিটগুলি এমন কিছু যা অন্য কোনও বিষয় নির্দেশ করে না। আমি যদি বলি " অন্যথায় অ্যাক্সেস অযোগ্য কমেটের জন্য পুনরায় প্রতিক্রিয়া" বলি তখন কি এই উপকারে আসবে ?
এরিস্টটল পাগাল্টজিস

এই সব খুব বিভ্রান্তিকর। আসুন এটি সহজ করা যাক। শাখায় থাকাকালীন master, আপনি git commitএকটি প্রতিশ্রুতি পান 000001। তারপরে আপনি তা করেন git commit --amendযা আপনাকে প্রতিশ্রুতিবদ্ধ করে 000002। এখানে কোনও ইশারা দেয় এমন কোনও ট্যাগ বা শাখা 000001নেই, এবং আপনি --reflogবিকল্প ছাড়া এটি আপনার লগে দেখতে পাচ্ছেন না , তবে আপনি যদি চান তবে আপনি এটিতে যেতে পারেন git checkout 000001। এখন প্রশ্নটি হল, 000001একটি ঝুঁকির প্রতিশ্রুতি, বা একটি অ্যাক্সেস অযোগ্য প্রতিশ্রুতি, না উভয়ই বা উভয়ই?
ছারভে

264

সমস্ত ঝুঁকিপূর্ণ কমিটগুলি অপসারণ করতে এবং পুনরায় ব্লগগুলি থেকে যারা আগমনের যোগ্য তারা এটি করে:

git reflog expire --expire-unreachable=now --all
git gc --prune=now

তবে নিশ্চিত হোন যে এটি আপনি চান। আমি আপনাকে ম্যান পেজগুলি পড়ার পরামর্শ দিচ্ছি তবে এখানে সংক্ষেপে বলা হয়েছে:

git gcঅ্যাক্সেসযোগ্য অবজেক্টস (কমিট, ট্রি, ব্লবস (ফাইল)) সরিয়ে দেয়। কোনও বস্তুর অ্যাক্সেসযোগ্য যদি এটি কোনও শাখার ইতিহাসের অংশ না হয়। আসলে এটি কিছুটা জটিল:

git gc কিছু অন্যান্য কাজ করে তবে সেগুলি এখানে প্রাসঙ্গিক নয় এবং বিপজ্জনক নয়।

অ্যাক্সেসযোগ্য অবজেক্টস যা দু'সপ্তাহের চেয়ে কম বয়সী তা অপসারণ করা হয় না তাই আমরা ব্যবহার করি --prune=nowযার অর্থ "এর আগে তৈরি করা না পারা যায় এমন বস্তুগুলি সরান" means

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

সুতরাং আমাদের একটি শাখা থেকে অ্যাক্সেসযোগ্য নয় এমন সমস্ত কিছুই সরিয়ে ফেলতে রিফ্লাগগুলি সরিয়ে ফেলতে হবে। আমরা --allরিফ্লাগগুলির মেয়াদ শেষ করে এটি করি। আবার Git ব্যবহারকারীদের রক্ষা করার জন্য reflogs একটি বিট তাই আমরা আবার এটা করতে না বলতে হবে রাখে: --expire-unreachable=now

যেহেতু আমি সাধারণত ধ্বংসাত্মক ক্রিয়াকলাপগুলি পুনরুদ্ধার করতে রিফ্লগটি ব্যবহার করি আমি সাধারণত --expire=nowপরিবর্তে ব্যবহার করি , যা রেফ্লোগগুলি সম্পূর্ণরূপে জ্যাপ করে।


1
আমি আপনাকে বলছি যে কোন আদেশগুলি ব্যবহার করার জন্য যা স্পষ্ট নয় - জিসি পর্যাপ্ত হওয়া উচিত নয়? আপনি যদি কখনও গিট-রেফ্লোগ ব্যবহার না করেন তবে আপনি জানেন না। সুতরাং এখন আপনি কি জানেন যে আপনার কী আদেশগুলি ব্যবহার করতে হবে তা তাদের ম্যান পৃষ্ঠাতে উল্লিখিত বিকল্পগুলি সন্ধান করা উচিত। অবশ্যই আমি কেবল সেখান থেকে সেই তথ্যটি অনুলিপি করতে পারতাম ...
তারাসিয়াস

1
আসলে আসলে আমি যা বলি ঠিক তা বলি: "সমস্ত ঝুঁকিপূর্ণ প্রতিশ্রুতিগুলি এবং রিফ্লাগগুলি থেকে আগত হওয়াগুলি মুছে ফেলুন"। আপনি যদি জানেন না যে রিফ্লাগগুলি কী: আবার ম্যানুয়ালটি পড়ুন।
তারসিয়াস

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

@ লিঃ সাফেরাইট আশা করি আপনি এখন সকলেই খুশি :-)
টারসিয়াস

12
git reflog expire --expire-unreachable=now --allআপনার সমস্ত স্ট্যাশস ড্রপ!
ভেসেভলোদ গোলভানভ

22

এই থ্রেডের সমস্ত পরামর্শ অনুসরণ করার পরেও আমার একই সমস্যা ছিল:

git reflog expire --expire-unreachable=now --all
git gc --prune=now
git fsck --unreachable --no-reflogs   # no output
git branch -a --contains <commit>     # no output
git show <commit>                     # still shows up

যদি এটি একটি রিফ্লোগ না এবং একটি শাখা না হয় ... তবে এটি অবশ্যই ট্যাগ হবে !

git tag                             # showed several old tags created before the cleanup

আমি ট্যাগগুলি মুছে দিয়ে git tag -d <tagname>ক্লিনআপটি পুনরায় পাঠিয়ে দিয়েছি এবং পুরানো কমিটগুলি চলে গেছে।


ট্যাগগুলি সম্পর্কে ইতিমধ্যে একটি উত্তর রয়েছে ( স্ট্যাকওভারফ্লো.com / a / 37335660 / 450127 ), এবং এটি নতুন কিছু যুক্ত করে বলে মনে হয় না। এটি কি পূর্বের উত্তরের পক্ষে সরানো উচিত নয়?
ইয়ান ডান

সত্যই, একরকম আমি উত্তরটি উপেক্ষা করেছি। যদিও 4 জন আমার উত্তর সহায়ক বলে মনে করেছে, তাই সম্ভবত এটি অকেজো নয়? এছাড়াও আমি সমস্ত সম্ভাব্যতার একটি সংক্ষিপ্ত উত্তরে ভাগ করেছি।
jakub.g

1
ডুপ্লিকেট করা থাকলেও এই পৃষ্ঠাটি গুগল রেজাল্টে উপস্থিত হতে পারে এবং এটি অবিলম্বে একই সমস্যাযুক্ত লোকদের বার বার মানুষকে সঠিক উত্তর থাকতে পারে এমন লিঙ্কগুলিতে পুনঃনির্দেশ করার চেয়ে আরও ভালভাবে সহায়তা করে ।
আলেকজান্দ্রি টি।

14
git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042

সম্ভবত শুধু প্রয়োজন

git branch -a --contains 793db7f272ba4bbdd1e32f14410a52a412667042

রিমোটগুলি থেকে শাখাগুলিতেও রিপোর্ট করা


ধন্যবাদ, এখন আমি আমার রিমোটগুলি / উত্স / পরবর্তী খুঁজে পেয়েছি যা এখনও এই প্রতিশ্রুতি রক্ষা করে। কিভাবে এটি সরিয়ে? git push -d origin nextসাহায্য করে না
আইআরএস


ধন্যবাদ - git fetch --pruneকৌশলটি। তবে সমস্ত উত্তরে আমি ট্যাগগুলির জন্য একটি চেক মিস করছি যা এই প্রতিশ্রুতিটি উল্লেখ করছে। প্রতিশ্রুতি দিয়ে ট্যাগগুলি কীভাবে চেক করতে হয় তা আমি এখনও জানি না (আমি সমস্ত সরিয়ে দিয়েছি)।
আইআরএস

তবে ... এর অর্থ কি এই যে প্রতিশ্রুতিগুলি কেবল প্রত্যন্ত শাখাগুলি থেকে পৌঁছতে পারে (এবং কোনও স্থানীয় শাখা নেই) তা পৌঁছনীয় বলে বিবেচিত হয় এবং তাই git fsck --unreachableকোন কমিটগুলি পৌঁছনীয় তা নিশ্চিত করার জন্য এটি রিমোটের সাথে নেটওয়ার্কের সাথে যোগাযোগ করছে?
LarsH

1
আমার নিজের প্রশ্নের উত্তর দিয়েছি ... হ্যাঁ, কেবলমাত্র প্রত্যন্ত শাখাগুলি থেকে (এবং কোনও স্থানীয় শাখা নেই) পৌঁছনীয় বলে বিবেচিত হয়; কিন্তু git fsck --unreachableবেশি খুঁজে বের করতে যা দূরবর্তী শাখা যা করে থাকে, যাতে দূরবর্তী সঙ্গে নেটওয়ার্ক যোগাযোগ করতে প্রয়োজন হবে না। দূরবর্তী শাখার তথ্য স্থানীয়ভাবে .git/refs/remotes/origin( যেমন packed-refs) এর অধীনে সংরক্ষণ করা হয় ।
লার্শ

8

আমারও একি দশা. আমি দৌড়েছি git branch --contains <commit>, এবং এটি প্রশ্নের মতো কোনও আউটপুট ফেরেনি।

তবে দৌড়ানোর পরেও

git reflog expire --expire-unreachable=now --all
git gc --prune=now

আমার প্রতিশ্রুতি এখনও ব্যবহার করে অ্যাক্সেসযোগ্য ছিল git show <commit>। কারণ এটির বিচ্ছিন্ন / জঞ্জাল "শাখা" এর মধ্যে একটির কমিট ট্যাগ করা হয়েছিল। আমি ট্যাগটি সরিয়েছি, উপরের কমান্ডগুলি আবার চালিয়েছি, এবং আমি সোনার হয়েছি। git show <commit>ফিরে fatal: bad object <commit>- ঠিক আমার যা প্রয়োজন ছিল। আশা করি এটি আমার মতো আটকে থাকা অন্য কাউকে সহায়তা করে।


আপনি ট্যাগটি মুছে ফেললেন কীভাবে?
15:40

@ বাপর্স সমস্ত ট্যাগের তালিকাবদ্ধ করুন, প্রশ্নে প্রতিশ্রুতিবদ্ধতার উল্লেখ করে একটি সন্ধান করুন এবং তারপরে এটি মুছুন। stackoverflow.com/questions/5480258/…
অ্যান্ড্রু লারসন

4

আমি দুর্ঘটনাক্রমে একই পরিস্থিতিতে আঘাত পেয়েছি এবং আমার স্ট্যাশগুলিতে অ্যাক্সেসযোগ্য প্রতিশ্রুতির উল্লেখ রয়েছে এবং এভাবে অনুমানযোগ্য অপ্রাপ্য প্রতিশ্রুতি স্ট্যাশগুলি থেকে পৌঁছতে পারা যায়।

এগুলি এটিকে সত্যিকারের নাগালের বাইরে নিয়ে যাওয়ার জন্য আমি করেছি।

git stash clear
git reflog expire --expire-unreachable=now --all
git fsck --unreachable
git gc --prune=now

2

git gc --prune=<date>দুই সপ্তাহ আগে পুরানো অবজেক্টে ডিফল্ট। আপনি আরও একটি সাম্প্রতিক তারিখ সেট করতে পারেন। তবে, গিট কমান্ডগুলি যা আলগা বস্তু তৈরি করে তা সাধারণত গিট জিসি - আউটো চালাবে (যা তাদের আলগা জিনিসগুলি কনফিগারেশনের ভেরিয়েবলের মান সীমা ছাড়িয়ে গেলে ছাঁটাই করে দেয়)।

আপনি কি নিশ্চিত যে আপনি এই কমিটগুলি মুছতে চান? gc.auto এর ডিফল্ট সেটিংস নিশ্চিত করবে যে আলগা বস্তুগুলি অযৌক্তিক পরিমাণ স্মৃতি গ্রহণ না করে এবং কিছু সময়ের জন্য আলগা বস্তুগুলি সঞ্চয় করা সাধারণত একটি ভাল ধারণা। এইভাবে, যদি আপনি আগামীকাল বুঝতে পারেন যে আপনার মোছা শাখায় আপনার প্রয়োজনীয় প্রতিশ্রুতি রয়েছে, আপনি এটি পুনরুদ্ধার করতে পারেন।

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