তাদের .gitignore এ যুক্ত করার পরে দূরবর্তী সংগ্রহস্থল থেকে ডিরেক্টরি সরান


596

আমি প্রতিশ্রুতিবদ্ধ এবং গিথুব কিছু ডিরেক্টরি ঠেলা। এর পরে, আমি .gitignoreফাইলটি এমন একটি ডিরেক্টরি যুক্ত করে পরিবর্তন করেছি যা উপেক্ষা করা উচিত। সবকিছু ঠিকঠাক কাজ করে, তবে (এখন উপেক্ষা করা) ডিরেক্টরিটি গিথুবে থাকে।

গিথুব এবং সংগ্রহস্থল ইতিহাস থেকে কীভাবে আমি সেই ডিরেক্টরি মুছব?


উত্তর:


1062

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

git rm -r --cached some-directory
git commit -m 'Remove the now ignored directory "some-directory"'
git push origin master

আপনার সংগ্রহশালাটির ইতিহাস পুনর্লিখন না করে আপনি ফাইলটি আপনার ইতিহাস থেকে মুছতে পারবেন না - অন্য কেউ যদি আপনার সংগ্রহশালার সাথে কাজ করছে বা আপনি এটি একাধিক কম্পিউটার থেকে ব্যবহার করছেন তবে আপনার এটি করা উচিত নয়। আপনি যদি এখনও এটি করতে চান তবে আপনি git filter-branchইতিহাসটি পুনরায় লেখার জন্য ব্যবহার করতে পারেন - এখানে একটি সহায়ক গাইড রয়েছে

অতিরিক্তভাবে, দ্রষ্টব্য আউটপুটটি git rm -r --cached some-directoryএমন কিছু হবে:

rm 'some-directory/product/cache/1/small_image/130x130/small_image.jpg'
rm 'some-directory/product/cache/1/small_image/135x/small_image.jpg'
rm 'some-directory/.htaccess'
rm 'some-directory/logo.jpg'

rmসংগ্রহস্থলের সম্পর্কে Git থেকে প্রতিক্রিয়া হয়; ফাইলগুলি এখনও কার্যকরী ডিরেক্টরিতে রয়েছে।


3
অন্য কেউ যদি টানেন, তবে এখন তাদের উপেক্ষা করা ফাইলগুলি কি তাদের জন্য মুছে ফেলা হবে বা অচ্ছুত থাকবে?
মার্টিন কোনিসেক

3
@ মার্টিন কোনিসেক: যে ব্যবহারকারীরা এই পরিবর্তনগুলি টানছেন তাদের যদি এই ফাইলগুলিতে কোনও পরিবর্তন না হয়, তবে সেগুলি সরানো হবে।
লংগায়ারকে

@MarkLongair কি -rএবং --cached। ধন্যবাদ।
লাবানিনো

12
@ লাবানিনো: এর -rঅর্থ হ'ল পুনরাবৃত্ত, যদি আপনি পুরো ডিরেক্টরিগুলি করেন doing --cachedওভাররাইড Git এগুলির কাজ ডিরেক্টরি থেকে মুছে ফেলার স্বাভাবিক আচরণ এবং সংগঠনের জন্য মুছে ফেলার উপস্থাপনকারী, এবং তোলে Git শুধুমাত্র সংগঠনের জন্য প্রস্তুত উপস্থাপনকারী এলাকায় কাজ করে। এইভাবে আপনি গিটকে বলবেন যে আপনি নিজের ফাইলের স্থানীয় অনুলিপি রাখতে চান।
এপথ

2
এটি দুর্দান্ত কাজ করে তবে প্রথমে আমাকে করতে হয়েছিল: কাজের git reset name_of_fileজন্য উপরে বর্ণিত বিষয়গুলির জন্য
এডওয়ার্ড হাগল্যান্ড

248

আমি এটা করি:

git rm --cached `git ls-files -i --exclude-from=.gitignore` 
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master

যা আপনার গিটকে উপেক্ষা করে সমস্ত ফাইল / ফোল্ডার সরিয়ে ফেলবে, সংরক্ষণের জন্য আপনাকে নিজে নিজে বেছে নিতে হবে


এটি আমার পক্ষে কাজ করা বন্ধ করে দিয়েছে বলে মনে হচ্ছে, আমি এখন:

 git rm -r --cached . 
 git add .
 git commit -m 'Removed all files that are in the .gitignore' 
 git push origin master

4
ধন্যবাদ, এটি আমাকে অনেক সাহায্য করেছে! আপনি যদি উইন্ডোজ পাওয়ারশেল ব্যবহার করছেন তবে আপনি করতে পারেনforeach ($i in iex 'git ls-files -i --exclude-from=.gitignore') { git rm --cached $i }
ম্যাথু

10
আপনার দ্বিতীয় পদ্ধতির চেষ্টা করে, এটি আমার স্থানীয় গিট থেকে সমস্ত ফাইল সরিয়ে দিয়েছে!
আর্টনিকপ্রো 23

2
আমার মনে হয় আপনার সাবডিরেক্টরিতে নেভিগেট করার এবং এটি করার কথা রয়েছে। আমি ভুল হলে শুধরে.

বাচ্চারা আজ আমরা কী শিখলাম? "স্ট্যাক ওভারফ্লোতে আপনি যে এলোমেলো কোড পান সেটি চালাবেন না!"
জোনাথন ল্যান্ড্রাম

49

আমার উত্তর অনুসারে এখানে: গিট সংগ্রহস্থল থেকে একটি ডিরেক্টরি কীভাবে সরাবেন?

ফোল্ডার / ডিরেক্টরিটি কেবল গিট সংগ্রহস্থল থেকে সরান এবং স্থানীয় থেকে নয় 3 টি সহজ পদক্ষেপ চেষ্টা করুন।


ডিরেক্টরি সরানোর পদক্ষেপ

git rm -r --cached FolderName
git commit -m "Removed folder from repository"
git push origin master

পরবর্তী কমিটগুলিতে সেই ফোল্ডারটিকে উপেক্ষা করার পদক্ষেপ

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

.gitignore ফাইলটি এর মতো দেখতে হবে

/FolderName

ডিরেক্টরি সরান


1
আমি ঠিক এটিই খুঁজছিলাম। ধন্যবাদ :)
রোহিত সিং

আমি আনন্দিত যে এটি @ রোহিত সিংকে সাহায্য করেছে
ইয়ারনাইওস

9

ব্লুন্ডেলের প্রথম উত্তরটি আমার পক্ষে কার্যকর হয়নি। তবে এটি আমাকে সঠিক উপায়ে দেখিয়েছে। আমি এই একই জিনিস করেছি:

> for i in `git ls-files -i --exclude-from=.gitignore`; do git rm --cached $i; done
> git commit -m 'Removed all files that are in the .gitignore'
> git push origin master

আমি আপনাকে নীচের বিবৃতিটি চালিয়ে প্রথমে মুছে ফেলার ফাইলগুলি পরীক্ষা করতে পরামর্শ দিচ্ছি:

git ls-files -i --exclude-from=.gitignore

আমি ভিজ্যুয়াল স্টুডিওর জন্য একটি ডিফল্ট .gitignore ফাইল ব্যবহার করছিলাম এবং আমি লক্ষ্য করেছি যে এটি আমার লঙ্ঘনীয় কাজ নয় এমন প্রকল্পের সমস্ত লগ এবং বিন ফোল্ডারগুলি সরিয়ে ফেলছে।


5

দ্রষ্টব্য: এই সমাধানটি কেবল গিথুব ডেস্কটপ জিইউআইয়ের সাথে কাজ করে ।

গিথুব ডেস্কটপ জিইউআই ব্যবহার করে এটি খুব সহজ।

  1. অস্থায়ীভাবে ফোল্ডারটিকে অন্য কোনও স্থানে (প্রকল্প ফোল্ডারের বাইরে নিয়ে যাওয়া) সরিয়ে দিন।

  2. আপনার .gitignoreফাইলটি সম্পাদনা করুন এবং ফোল্ডার এন্ট্রি সরিয়ে ফেলুন যা গিথুব পৃষ্ঠায় মাস্টার সংগ্রহস্থল সরান।

  3. প্রকল্প ফোল্ডারটি কমিট করুন এবং সিঙ্ক করুন।

  4. প্রোজেক্ট ফোল্ডারে ফোল্ডারটি আবার সরান

  5. .gitignoreফাইলটি পুনরায় সম্পাদনা করুন।

এখানেই শেষ.


5

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

git ls-files -i --exclude-from=.gitignore > to_remove.txt
while read line; do `git rm -r --cached "$line"`; done < to_remove.txt
rm to_remove.txt
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master

4

এই পদ্ধতিটি স্ট্যান্ডার্ড .gitignore আচরণ প্রয়োগ করে এবং উপেক্ষা করা দরকার এমন ফাইলগুলিকে ম্যানুয়ালি উল্লেখ করার প্রয়োজন নেই

ব্যবহার করতে পারছি না --exclude-from=.gitignoreআর : / - আপডেট হওয়া পদ্ধতিটি এখানে:

সাধারণ পরামর্শ: একটি পরিষ্কার রেপো দিয়ে শুরু করুন - প্রতিশ্রুতিবদ্ধ সমস্ত কিছুই, ডিরেক্টরি ডিরেক্টরি বা সূচীতে কোনও কিছুই মুলতুবি নেই এবং ব্যাকআপ করুন !

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"

#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached

#optionally add anything to the index that was previously ignored but now shouldn't be:
git add *

#commit again
#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.

git commit -m "re-applied modified .gitignore"

#other devs who pull after this commit is pushed will see the  newly-.gitignored files DELETED

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


0

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

PS MyRepo> git filter-branch --force --index-filter
>> "git rm --cached --ignore-unmatch -r .\\\path\\\to\\\directory"
>> --prune-empty --tag-name-filter cat -- --all

তারপরে git push --force --all,।

ডকুমেন্টেশন: https://git-scm.com/docs/git-filter-branch


কীভাবে ব্যবহার করা git filter-branchথেকে আলাদা করা হচ্ছে git rm? আমি মূলত ভাবছিলাম যে আমাকে একটি সংস্করণ ব্যবহার করতে হবে git filter-branchতবে বেশিরভাগ মন্তব্য এখানে ব্যবহার করার পরামর্শ দেয় git rm। আমি যা বুঝি git rmতা থেকে এটি কেবল বর্তমান কার্যকারী ডিরেক্টরি এবং সূচক থেকে সরিয়ে দেয়। তবে এর সাথে যুক্ত হওয়া একাধিক কমিট আগেও এটি সংরক্ষণাগারে থাকবে।
alpha_989

ঠিক। git rmভবিষ্যতে সর্বশেষ প্রতিশ্রুতি থেকে ফাইলটি সরিয়ে ফেলবে। git filter-branchআমাদের এটি পুরো ইতিহাস থেকে সরাতে দিন। আরও দেখুন: help.github.com/articles/…
শান লুটিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.