ফিল্টার-শাখা --Tree- ফিল্টার পরে গিট রেপো থেকে রেফ / মূল / মাথা / মাস্টার সরান?


180

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

আমি এখানে এই উত্তরটি অনুসরণ করেছি: একটি উপ-ডিরেক্টরিতে একটি বিদ্যমান সংগ্রহস্থল সাবমুট করতে মূল ডিরেক্টরিতে নতুন গিট সংগ্রহস্থল

এখন, gitk --allদুটি ইতিহাস দেখায়: একটি বর্তমানের সমাপ্তি master, এবং একটির নাম original/refs/heads/master

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

কিভাবে আমি তা পরিত্রাণ পেতে পারি?

নিজেকে পুনরুত্পাদন করতে:

mkdir -p project-root/path/to/module
cd project-root/path/to/module
mkdir dir1 dir2 dir3 
for dir in * ; do touch $dir/source-file-$dir.py ; done
git init
git add .
git commit -m 'Initial commit'

এখন আমাদের মূল পোস্টারের সমস্যা আছে। উপরের লিঙ্কিত উত্তরটি ব্যবহার করে গিট রেপোর গোড়াটি প্রকল্প-রুটে স্থানান্তরিত করুন:

git filter-branch --tree-filter 'mkdir -p path/to/module ; git mv dir1 dir2 dir3 path/to/module' HEAD
rm -rf path
cd ../../../ # Now PWD is project-root
mv path/to/module/.git .
git reset --hard

এখন, আমার বর্তমান সমস্যাটি দেখুন:

gitk --all &
git show-ref

আমি কীভাবে refs/original/heads/masterসম্পর্কিত এবং সমস্ত সম্পর্কিত ইতিহাস থেকে মুক্তি পাব ?


উত্তর:


320

refs/original/*আপনি যদি আপনার ফিল্টার-শাখাকে বিশৃঙ্খলা করে তবে ব্যাকআপ হিসাবে উপস্থিত রয়েছে। বিশ্বাস করুন, এটি সত্যিই ভাল ধারণা।

একবার আপনি ফলাফলগুলি পরিদর্শন করেছেন, এবং আপনি যে খুব চান তা আপনার কাছে খুব আত্মবিশ্বাসী হয়ে গেলে আপনি ব্যাক আপ করা রেফটি সরিয়ে ফেলতে পারেন:

git update-ref -d refs/original/refs/heads/master

বা আপনি যদি অনেকগুলি রেফের সাথে এটি করেন এবং আপনি এটি সমস্ত মুছতে চান:

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

(এটি সরাসরি ফিল্টার-শাখার ম্যানপেজ থেকে নেওয়া হয়েছে))

এটি আপনার জন্য প্রযোজ্য নয়, তবে অন্যদের জন্য যারা এটি খুঁজে পেতে পারে: আপনি যদি এমন একটি ফিল্টার-শাখা করেন যা উল্লেখযোগ্য ডিস্কের স্থান গ্রহণ করে সামগ্রী সরিয়ে দেয় , আপনি চালাতে git reflog expire --expire=now --allএবং git gc --prune=nowআপনার পুনর্বিবেচনার মেয়াদ সরিয়ে নেওয়ার জন্য এবং এখন অব্যবহৃত অবজেক্টগুলি মুছতে চাইতে পারেন । (সতর্কতা: সম্পূর্ণরূপে, সম্পূর্ণ অপরিবর্তনীয়) আপনি এটি করার আগে খুব নিশ্চিত হন)


আপডেট-রেফ, রেফ্লগের মেয়াদ এবং জিসি করার পরে, এই দুটি ফাইলই এখনও মূল রেফারেন্স উল্লেখ করে: .git / তথ্য / রেফস এবং .git / প্যাকড-রেফস দেখে মনে হচ্ছে এর পরিবর্তে এটি বলা উচিত:git update-ref -d refs/original/refs/heads/master
lhunath

1
আমার ধারণা আপনি দুর্ঘটনাক্রমে শব্দগুলি মিশ্রিত করেছেন: আমি যদি ঠিক আছি তবে তা হওয়া উচিত git update-ref -d original/refs/heads/master? তবে, কেবলমাত্র আপনার দ্বিতীয় আদেশটি আমার পক্ষে কাজ করেছিল।
জেজেডি

4
এটি git update-ref -d refs/original/refs/heads/masterবিটিডব্লিউ ব্যবহার করে পুরো নামটি দেখতে পাবেন git show-ref
অকর্মা

4
খাটো git show-ref refs/original/* --hash | xargs -n 1 git update-ref -dকি হবে?
চার্লসবি


6

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

rm -Rf .git/refs/original
git gc --aggressive --prune=now
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.