git - বর্তমান গিটটি শুধুমাত্র একটি(প্রাথমিক) একটি গিট রিপোজিটরিতে কমিট করুন?




github git-commit (10)

আমি বর্তমানে একটি স্থানীয় গিট সংগ্রহস্থল আছে, যা আমি একটি Github সংগ্রহস্থল থেকে ধাক্কা।

স্থানীয় সংগ্রহস্থল ~ ~ 10 টি, এবং গীথাব সংগ্রহস্থলটি এর একটি সিঙ্ক্রোনাইজড ডুপ্লিকেট।

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

তারপর আমি এই পরিবর্তনগুলি জিথুবকে ধাক্কা দিতে চাই।

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

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


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

আরো একটি ধারণাগত উত্তর:

কোন ট্যাগ / শাখা / refs তাদের পয়েন্ট যদি গিট স্বয়ংক্রিয়ভাবে আবর্জনা পুরাতন কৃতিত্ব সংগ্রহ। সুতরাং আপনাকে কেবলমাত্র সমস্ত ট্যাগ / শাখাগুলি সরাতে হবে এবং কোনও শাখার সাথে সম্পর্কিত একটি নতুন অনাথ কমিটি তৈরি করতে হবে - কনভেনশন অনুসারে আপনি শাখার master পয়েন্টকে সেই কমিটিতে রাখতে দেবেন।

পুরাতন, অব্যবহৃত commits তারপর কেউ আবার দেখা হবে না যদি না তারা নিম্ন স্তরের গিট কমান্ড সঙ্গে খনন করা। যদি এটি আপনার জন্য পর্যাপ্ত হয় তবে আমি সেখানেই থামব এবং স্বয়ংক্রিয় GC যখনই এটি করতে চায় তার কাজটি করতে দেয়। আপনি যদি সরাসরি তাদের থেকে পরিত্রাণ পেতে চান, তবে আপনি git gc ব্যবহার করতে পারেন (সম্ভবত - --aggressive --prune=all )। রিমোট গিট রিপোজিটরির জন্য, যদিও এটির জন্য আপনার ফাইল সিস্টেমের শেল অ্যাক্সেস না থাকলেও এটির জন্য আপনাকে কোনও উপায় কার্যকর করতে হবে না।


গিট থেকে শেষ কমিট অপসারণ করতে, আপনি কেবল চালাতে পারেন

git reset --hard HEAD^ 

আপনি শীর্ষ থেকে একাধিক commits অপসারণ করা হয়, আপনি চালাতে পারেন

git reset --hard HEAD~2 

শেষ দুই commits মুছে ফেলার জন্য। আপনি এমনকি আরও commits মুছে ফেলার জন্য সংখ্যা বৃদ্ধি করতে পারেন।

আরো তথ্য এখানে।

Git tutoturial এখানে কীভাবে রিপোজিটরিটি পরিষ্কার করা যায় সে বিষয়ে সহায়তা প্রদান করে:

আপনি ইতিহাস থেকে ফাইলটি সরাতে চান এবং এটি ভুলভাবে পুনঃ প্রতিশ্রুতিবদ্ধ না করে নিশ্চিত করতে। gitignore এ জুড়তে চান। আমাদের উদাহরণের জন্য, আমরা GitHub মণি সংগ্রহস্থল থেকে Rakefile অপসারণ করতে যাচ্ছি।

git clone https://github.com/defunkt/github-gem.git

cd github-gem

git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch Rakefile' \
  --prune-empty --tag-name-filter cat -- --all

এখন আমরা ইতিহাস থেকে ফাইলটি মুছে ফেলি, আসুন আমরা নিশ্চিতভাবেই এটি পুনর্বিবেচনা করব না।

echo "Rakefile" >> .gitignore

git add .gitignore

git commit -m "Add Rakefile to .gitignore"

আপনি যদি রিপোজিটরির অবস্থা নিয়ে খুশি হন, তবে রিমোট রিপোজিটরিটি মুছে ফেলার জন্য আপনাকে পরিবর্তনগুলি চাপ-ধাক্কা দিতে হবে।

git push origin master --force


আমার জন্য কাজ করে যে একমাত্র সমাধান (এবং কাজ submodules রাখে) হয়

git checkout --orphan newBranch
git add -A  # Add all files and commit them
git commit
git branch -D master  # Deletes the master branch
git branch -m master  # Rename the current branch to master
git push -f origin master  # Force push master branch to github
git gc --aggressive --prune=all     # remove the old files

মুছে .git/ সর্বদা যখন আমি submodules আছে বিশাল সমস্যাগুলির কারণ। git rebase --root ব্যবহার করে - git rebase --root আমার জন্য দ্বন্দ্ব সৃষ্টি করবে (এবং ইতিহাসের অনেক সময় পরে দীর্ঘ সময় লাগবে)।


এই আমার পছন্দের পদ্ধতির:

git branch new_branch_name $(echo "commit message" | git commit-tree HEAD^{tree})

এটি হিটে সবকিছু যুক্ত করে এমন একটি কমিটির সাথে একটি নতুন শাখা তৈরি করবে। এটা অন্য কিছু পরিবর্তন করে না, তাই এটি সম্পূর্ণ নিরাপদ।


এখানে brute-force পদ্ধতির। এটি সংগ্রহস্থলের কনফিগারেশন মুছে ফেলে।

দ্রষ্টব্য : যদি রিপোজিটরিটিতে জমা থাকে তবে এটি কাজ করে না! আপনি submodules ব্যবহার করা হয়, আপনি যেমন ইন্টারেক্টিভ রিবেস ব্যবহার করা উচিত

পদক্ষেপ 1: সমস্ত ইতিহাস মুছে ফেলুন ( নিশ্চিত করুন যে আপনার ব্যাকআপ আছে, এটি প্রত্যাবর্তন করা যাবে না )

cat .git/config  # note <github-uri>
rm -rf .git

ধাপ ২: শুধুমাত্র বর্তমান সামগ্রী দিয়ে গিট রেপো পুনর্নির্মাণ করুন

git init
git add .
git commit -m "Initial commit"

ধাপ 3: GitHub থেকে ধাক্কা।

git remote add origin <github-uri>
git push -u --force origin master

নীচের পদ্ধতিটি পুরোপুরি পুনরুত্পাদনযোগ্য, তাই যদি উভয় পক্ষ সামঞ্জস্যপূর্ণ হয় তবে আবার ক্লোন চালানোর দরকার নেই, শুধু পাশাপাশি স্ক্রিপ্টটি চালান।

git log -n1 --format=%H >.git/info/grafts
git filter-branch -f
rm .git/info/grafts

যদি আপনি এটি পরিষ্কার করতে চান তবে এই স্ক্রিপ্টটি চেষ্টা করুন:

http://sam.nipl.net/b/git-gc-all-ferocious

আমি একটি স্ক্রিপ্ট লিখেছি যা রিপোজিটরির প্রতিটি শাখার জন্য "ইতিহাসকে হত্যা করে":

http://sam.nipl.net/b/git-kill-history

এছাড়াও দেখুন: http://sam.nipl.net/b/confirm


শুধু Github repo মুছে দিন এবং একটি নতুন তৈরি করুন। পর্যন্ত দ্রুততম, সহজতম এবং নিরাপদ পদ্ধতির। সর্বোপরি, গৃহীত সমাধানগুলির মধ্যে যে সমস্ত কমান্ডগুলি আপনি চান তা অর্জন করার জন্য আপনাকে কী করতে হবে?


git filter-branch প্রধান সার্জারি টুল।

git filter-branch --parent-filter true -- @^!

--parent-filter পিতামাতা --parent-filter পিতামাতার --parent-filter পায় এবং --parent-filter উপর পুনর্লিখিত পিতামাতার মুদ্রণ করা উচিত; ইউনিক্স true সফলভাবে প্রস্থান এবং কিছুই প্রিন্ট, তাই: কোন বাবা। @^! গিট শরথান্ড "মাথা নত কিন্তু তার পিতামাতার কোন" জন্য। তারপর অবসর অন্যান্য অন্যান্য refs এবং ধাক্কা মুছে দিন।


Larsmans এর প্রস্তাবিত পদ্ধতি বৈকল্পিক:

আপনার untrackfiles তালিকা সংরক্ষণ করুন:

git ls-files --others --exclude-standard > /tmp/my_untracked_files

আপনার জিট কনফিগারেশন সংরক্ষণ করুন:

mv .git/config /tmp/

তারপর larsmans এর প্রথম পদক্ষেপ সঞ্চালন:

rm -rf .git
git init
git add .

আপনার কনফিগারেশন পুনরুদ্ধার করুন:

mv /tmp/config .git/

আপনি untracked ফাইল আনটক্যাক:

cat /tmp/my_untracked_files | xargs -0 git rm --cached

তারপর কমিট করুন:

git commit -m "Initial commit"

এবং অবশেষে আপনার সংগ্রহস্থলের ধাক্কা:

git push -u --force origin master






git-commit