আপনি যদি অন্য বিকাশকারীদের কাছে ইতিহাস প্রকাশ করেন তবে আপনি যা করতে চান তা অত্যন্ত বিঘ্নজনক। আপনার ইতিহাসটি মেরামত করার পরে প্রয়োজনীয় পদক্ষেপগুলির জন্য ডকুমেন্টেশনে "আপস্ট্রিম রিবেস থেকে পুনরুদ্ধার"git rebase
দেখুন ।
আপনার কাছে কমপক্ষে দুটি বিকল্প রয়েছে: git filter-branch
এবং একটি ইন্টারেক্টিভ রিবেস, উভয় নীচে ব্যাখ্যা করা হয়েছে।
ব্যবহার git filter-branch
আমার একটি সাবভার্সিয়ন আমদানি থেকে বালি বাইনারি পরীক্ষার ডেটা নিয়ে একই রকম সমস্যা ছিল এবং গিট সংগ্রহস্থল থেকে ডেটা অপসারণ সম্পর্কে লিখেছিলাম ।
আপনার গিট ইতিহাসটি বলুন:
$ git lola --name-status
* f772d66 (HEAD, master) Login page
| A login.html
* cb14efd Remove DVD-rip
| D oops.iso
* ce36c98 Careless
| A oops.iso
| A other.html
* 5af4522 Admin page
| A admin.html
* e738b63 Index
A index.html
মনে রাখবেন যে git lola
এটি একটি মানসম্মত নয় তবে অত্যন্ত উপকারী alias সঙ্গে --name-status
সুইচ, আমরা গাছ প্রতিটি কমিট সঙ্গে যুক্ত পরিবর্তন দেখতে পারেন।
"কেয়ারলেস" কমিট (যার SHA1 অবজেক্টের নাম ce36c98) ফাইলটি oops.iso
হ'ল ডিভিডি- রিপটি দুর্ঘটনাক্রমে যুক্ত হয়েছিল এবং পরবর্তী কমিটে সরিয়ে দেওয়া হয়েছে, সিবি 14 ডিফডি। পূর্বোক্ত ব্লগ পোস্টে বর্ণিত কৌশলটি ব্যবহার করে, কার্যকর করার আদেশটি হ'ল:
git filter-branch --prune-empty -d /dev/shm/scratch \
--index-filter "git rm --cached -f --ignore-unmatch oops.iso" \
--tag-name-filter cat -- --all
বিকল্প:
--prune-empty
ফিল্টার অপারেশনের ফলে খালি হয়ে যাওয়া ( যেমন গাছ পরিবর্তন করবেন না) প্রতিশ্রুতিগুলি সরান। সাধারণ ক্ষেত্রে, এই বিকল্পটি একটি ক্লিনার ইতিহাস তৈরি করে।
-d
ফিল্টার করা ইতিহাস নির্মাণের জন্য ব্যবহারের জন্য অস্থায়ী ডিরেক্টরিটির নাম দেয়। আপনি যদি কোনও আধুনিক লিনাক্স বিতরণ চালিয়ে যাচ্ছেন তবে একটি গাছ/dev/shm
নির্দিষ্ট করে দেওয়ার ফলে দ্রুত কার্যকর হবে ।
--index-filter
মূল ইভেন্ট এবং ইতিহাসের প্রতিটি পদক্ষেপে সূচকের বিরুদ্ধে চলে। oops.iso
যেখানেই এটি পাওয়া যায় আপনি সরাতে চান তবে এটি সমস্ত কমিটিতে উপস্থিত নেই। কমান্ডটি git rm --cached -f --ignore-unmatch oops.iso
ডিভিডি-রিপ উপস্থিত থাকলে মুছে ফেলা হয় এবং অন্যথায় ব্যর্থ হয় না।
--tag-name-filter
ট্যাগের নামগুলি পুনরায় লেখার পদ্ধতি বর্ণনা করে। এর একটি ফিল্টার cat
হ'ল পরিচয় অপারেশন। উপরের নমুনার মতো আপনার ভান্ডারটিতে কোনও ট্যাগ নাও থাকতে পারে তবে আমি পুরো সাধারণতার জন্য এই বিকল্পটি অন্তর্ভুক্ত করেছি।
--
বিকল্পগুলির শেষটি নির্দিষ্ট করে git filter-branch
--all
নিম্নলিখিত --
সমস্ত refs জন্য সাধারণভাবে সংক্ষেপে হয়। আপনার সংগ্রহস্থল, উপরের নমুনার মতো, কেবলমাত্র একটি রেফ (মাস্টার) থাকতে পারে, তবে আমি সম্পূর্ণ সাধারণতার জন্য এই বিকল্পটি অন্তর্ভুক্ত করেছি।
কিছু মন্থন শেষে ইতিহাস এখন:
$ git lola --name-status
* 8e0a11c (HEAD, master) Login page
| A login.html
* e45ac59 Careless
| A other.html
|
| * f772d66 (refs/original/refs/heads/master) Login page
| | A login.html
| * cb14efd Remove DVD-rip
| | D oops.iso
| * ce36c98 Careless
|/ A oops.iso
| A other.html
|
* 5af4522 Admin page
| A admin.html
* e738b63 Index
A index.html
লক্ষ্য করুন যে নতুন "কেয়ারলেস" কমিট কেবল যুক্ত করে other.html
এবং "ডিভিডি-রিপ সরান" কমিট মাস্টার শাখায় আর নেই। refs/original/refs/heads/master
আপনি যদি ভুল করেন তবে লেবেলযুক্ত শাখায় আপনার মূল কমিট থাকে। এটিকে সরাতে, "একটি সংগ্রহস্থল সঙ্কুচিত করার জন্য চেকলিস্ট" এর ধাপগুলি অনুসরণ করুন ।
$ git update-ref -d refs/original/refs/heads/master
$ git reflog expire --expire=now --all
$ git gc --prune=now
একটি সহজ বিকল্পের জন্য, অযাচিত বিটগুলি বাতিল করতে ভাণ্ডারটি ক্লোন করুন।
$ cd ~/src
$ mv repo repo.old
$ git clone file:///home/user/src/repo.old repo
file:///...
ক্লোন ইউআরএল ব্যবহার করে কেবল হার্ডলিঙ্ক তৈরি করার পরিবর্তে বস্তু অনুলিপি করা হয়।
এখন আপনার ইতিহাস:
$ git lola --name-status
* 8e0a11c (HEAD, master) Login page
| A login.html
* e45ac59 Careless
| A other.html
* 5af4522 Admin page
| A admin.html
* e738b63 Index
A index.html
প্রথম দুটি কমিটের জন্য SHA1 অবজেক্টের নামগুলি ("সূচক" এবং "অ্যাডমিন পৃষ্ঠা") একই থাকায় কারণ ফিল্টার ক্রিয়াকলাপটি তাদের কমিটগুলিকে সংশোধন করেনি। "অমনযোগী" হারানো oops.iso
এবং "লগইন পৃষ্ঠা", একটি নতুন পিতা বা মাতা পেয়েছিলাম ফলে তাদের SHA1s করেনি পরিবর্তন।
ইন্টারেক্টিভ রিবেস
এর ইতিহাস সহ:
$ git lola --name-status
* f772d66 (HEAD, master) Login page
| A login.html
* cb14efd Remove DVD-rip
| D oops.iso
* ce36c98 Careless
| A oops.iso
| A other.html
* 5af4522 Admin page
| A admin.html
* e738b63 Index
A index.html
আপনি oops.iso
"অযত্ন" থেকে সরাতে চান যদিও আপনি এটি কখনও যোগ করেন নি, এবং তারপরে "ডিভিডি-রিপ সরান" আপনার পক্ষে অকেজো। সুতরাং, আমাদের ইন্টারেক্টিভ রিবেসে যাওয়ার পরিকল্পনাটি হ'ল "অ্যাডমিন পৃষ্ঠা," সম্পাদনা "কেয়ারলেস" এবং "ডিভিডি-রিপ সরান" বাতিল করুন।
চলমান $ git rebase -i 5af4522
নিম্নলিখিত বিষয়বস্তু দিয়ে একটি সম্পাদক শুরু করে।
pick ce36c98 Careless
pick cb14efd Remove DVD-rip
pick f772d66 Login page
# Rebase 5af4522..f772d66 onto 5af4522
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
আমাদের পরিকল্পনাটি কার্যকর করা হচ্ছে, আমরা এটিকে সংশোধন করি
edit ce36c98 Careless
pick f772d66 Login page
# Rebase 5af4522..f772d66 onto 5af4522
# ...
এটি হ'ল, আমরা "ডিভিডি-রিপ সরান" দিয়ে লাইনটি মুছুন এবং "কেয়ারলেস" এর edit
পরিবর্তে অপারেশনটি পরিবর্তন করুন pick
।
সম্পাদককে সংরক্ষণ-ছেড়ে দেওয়া নীচের বার্তা সহ কমান্ড প্রম্পটে আমাদের ফেলে দেয়।
Stopped at ce36c98... Careless
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
বার্তাটি আমাদের যেমন বলেছে, আমরা সম্পাদনা করতে চাই এমন "অযত্ন" প্রতিশ্রুতিতে রয়েছি, সুতরাং আমরা দুটি কমান্ড চালাচ্ছি।
$ git rm --cached oops.iso
$ git commit --amend -C HEAD
$ git rebase --continue
প্রথমটি সূচক থেকে আপত্তিকর ফাইলটি সরিয়ে দেয়। দ্বিতীয়টি আপডেট হওয়া সূচকে "অযত্ন" পরিবর্তন করে বা সংশোধন করে এবং -C HEAD
পুরানো প্রতিশ্রুতি বার্তাটি পুনরায় ব্যবহার করতে গিটকে নির্দেশ দেয়। অবশেষে, git rebase --continue
বাকি রিবেস অপারেশনটি নিয়ে এগিয়ে যায়।
এটি একটি ইতিহাস দেয়:
$ git lola --name-status
* 93174be (HEAD, master) Login page
| A login.html
* a570198 Careless
| A other.html
* 5af4522 Admin page
| A admin.html
* e738b63 Index
A index.html
যা আপনি চান