গিট: কোনও সংগ্রহস্থল থেকে ফাইলগুলি মোছা না করে কীভাবে সূচী থেকে ফাইল সরিয়ে ফেলা যায়


163

আপনি যখন ব্যবহার

git rm --cached myfile

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

কোনও ফাইল সিস্টেম থেকে মুছে না ফেলে কেবল সংস্করণ থেকে ফাইল সরানোর কোনও উপায় আছে?

সম্পাদনা: স্পষ্ট, আমি আশা করি।


সম্ভবত আপনি আপনার ব্যবহারের ক্ষেত্রে প্রসারিত করতে পারেন। সূচকটি পরবর্তী প্রতিশ্রুতিবদ্ধতার মঞ্চ ক্ষেত্র তাই আপনি যদি বর্তমান শাখা থেকে মুছে ফেলতে চান না কেন আপনি সূচী থেকে ফাইলটি সরাতে চান?
সিবি বেইলি

1
আমি দুঃখিত. আমি বলতে চাইছিলাম যে মাইফাইলটি বেশ কিছুদিন আগে কোনও কারণে কমিট এবং বিতরণ করা হয়েছে। এখন লক্ষ্যটি হ'ল এটি জনগণের সিস্টেম থেকে মোছা না করে সংস্করণ থেকে এড়ানো। এটি সামনে আসার কারণ হ'ল আমি দুর্ঘটনাক্রমে একটি কনফিগার ফাইল ফাইল করেছিলাম। কনফিগার ফাইলটি প্রয়োজনীয়, তাই আমি এটিকে বিদেশী সিস্টেমগুলি থেকে সরাতে চাই না।
ফ্লেচার মুর

প্রশ্নটি আরও পরিষ্কার হওয়ার জন্য আমি সম্পাদনা করেছি।
ফ্লেচার মুর

3
git rm --cached ফাইলটি অন্য কার্যক্ষম ডিরেক্টরি থেকে সরাবে না। কেবলমাত্র সেই ডিরেক্টরিতে কাজ করা কেউ যদি একটি টান চালায় তবে ফাইলটি সরানো হবে। ফাইলটি "গিট চেকআউট হেড @ {1} ফু" দিয়ে সহজেই পুনরুদ্ধার করা যেতে পারে (
টানানোর সাথে

উত্তর:


119

আমি মনে করি না যে গিট কমিট "এই ফাইলটি ট্র্যাক করা বন্ধ করুন, তবে এটি মুছবেন না" এর মতো কোনও উদ্দেশ্য রেকর্ড করতে পারে।

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


একটি অনুলিপি সংরক্ষণ করুন, মুছে ফেলা প্রয়োগ করুন, পুনরুদ্ধার করুন

সম্ভবত সবচেয়ে সহজ কাজটি হ'ল আপনার ডাউনস্ট্রিম ব্যবহারকারীদের ফাইলটির একটি অনুলিপি সংরক্ষণ করতে, আপনার মুছতে টানতে, এবং ফাইলটি পুনরুদ্ধার করতে। যদি তারা পুনর্বাসনের মাধ্যমে টানতে থাকে এবং ফাইলে পরিবর্তন আনতে থাকে তবে তারা দ্বন্দ্ব পাবে। এই জাতীয় দ্বন্দ্ব সমাধানের জন্য, ব্যবহার করুন git rm foo.conf && git rebase --continue(যদি বিরোধী প্রতিশ্রুতি মুছে ফেলা ফাইলগুলি ছাড়াও পরিবর্তিত হয়) বা git rebase --skip(যদি বিবাদী প্রতিশ্রুতি কেবলমাত্র সরানো ফাইলটিতে পরিবর্তিত হয়)।

এটি মুছে ফেলা একটি প্রতিশ্রুতি সরিয়ে দেওয়ার পরে ফাইলটিকে অবরুদ্ধ হিসাবে পুনরুদ্ধার করুন

যদি তারা ইতিমধ্যে আপনার মোছার প্রতিশ্রুতিটি টানতে থাকে তবে তারা গিট শো সহ ফাইলটির পূর্ববর্তী সংস্করণটি পুনরুদ্ধার করতে পারে :

git show @{1}:foo.conf >foo.conf

বা গিট চেকআউট সহ (উইলিয়াম পার্সেলের মন্তব্য অনুসারে; তবে এটি সূচী থেকে আবার সরিয়ে ফেলতে ভুলবেন না!):

git checkout @{1} -- foo.conf && git rm --cached foo.conf

যদি তারা আপনার মোছা টানানোর পরে অন্য পদক্ষেপ নিয়ে থাকে (বা তারা রিবেসটি একটি বিচ্ছিন্ন হেডের দিকে টানছে), তাদের ছাড়া অন্য কিছু প্রয়োজন হতে পারে @{1}। তারা git log -gআপনার মোছা টানার আগেই তারা প্রতিশ্রুতি সন্ধান করতে পারে।


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

ফাইলটিকে একটি 'ডিফল্ট' হিসাবে রাখুন এবং ম্যানুয়ালি / স্বয়ংক্রিয়ভাবে এটি সক্রিয় করুন

যদি সম্পূর্ণরূপে সংগ্রহস্থলের মধ্যে কনফিগারেশন ফাইল বিষয়বস্তু বজায় রাখা অব্যাহত রাখার জন্য অগ্রহণযোগ্য না হয় তবে আপনি (যেমন) থেকে ট্র্যাক ফাইল নামান্তর করতে সক্ষম হতে পারেন foo.confথেকে foo.conf.defaultএবং তারপর আপনার ব্যবহারকারীদের নির্দেশ cp foo.conf.default foo.confপ্রয়োগের পুনঃনামকরণ কমিট পরে। অথবা, ব্যবহারকারীরা ইতিমধ্যে Makefileআপনার সফ্টওয়্যারটি লঞ্চ / স্থাপনের জন্য সংগ্রহস্থলের কিছু বিদ্যমান অংশ (উদাহরণস্বরূপ কোনও সংগ্রহশালা (যেমন বা অনুরূপ) দ্বারা সামগ্রী দ্বারা কনফিগার করা স্ক্রিপ্ট বা অন্য কোনও প্রোগ্রাম ) ব্যবহার করে, আপনি লঞ্চ / ডিফল্টে ডিফল্ট পদ্ধতিটি অন্তর্ভুক্ত করতে পারেন / প্রক্রিয়া মোতায়েন করুন:

test -f foo.conf || test -f foo.conf.default &&
    cp foo.conf.default foo.conf

জায়গায় এই ধরনের একটি খেলাপি ব্যবস্থায়, ব্যবহারকারীরা একটি যে renames কমিট টান করতে সক্ষম হওয়া উচিত foo.confকরতে foo.conf.defaultকোন অতিরিক্ত কাজ না করেও। এছাড়াও, আপনি যদি ভবিষ্যতে অতিরিক্ত ইনস্টলেশন / সংগ্রহস্থলগুলি তৈরি করেন তবে ম্যানুয়ালি একটি কনফিগারেশন ফাইল অনুলিপি করা থেকে বিরত থাকতে হবে।

পুনর্লিখনের ইতিহাসকে যাইহোক ম্যানুয়াল হস্তক্ষেপ প্রয়োজন ...

যদি সংগ্রহস্থলটিতে বিষয়বস্তু বজায় রাখা অগ্রহণযোগ্য হয় তবে আপনি সম্ভবত ইতিহাসের মতো কিছু দিয়ে এটি পুরোপুরি মুছে ফেলতে চাইবেন git filter-branch --index-filter …। Rewriting ইতিহাস, যা প্রতিটি শাখা / সংগ্রহস্থলের জন্য ম্যানুয়াল হস্তক্ষেপের প্রয়োজন হবে এই পরিমাণে (দেখুন "আপস্ট্রিম রি-বেসের ফলে থেকে পুনরুদ্ধার" বিভাগের Git রি-বেসের ফলে র manpage )। আপনার কনফিগারেশন ফাইলের জন্য প্রয়োজনীয় বিশেষ চিকিত্সা পুনর্লিখন থেকে পুনরুদ্ধার করার সময় অবশ্যই অন্য একটি পদক্ষেপ করা উচিত:

  1. কনফিগারেশন ফাইলের একটি অনুলিপি সংরক্ষণ করুন।
  2. পুনর্লিখন থেকে পুনরুদ্ধার।
  3. কনফিগারেশন ফাইলটি পুনরুদ্ধার করুন।

পুনরাবৃত্তি রোধ করতে এটি উপেক্ষা করুন

আপনি যে কোনও পদ্ধতি ব্যবহার করুন না কেন আপনি সম্ভবত কনফিগারেশন ফাইলের নামটি একটি .gitignoreফাইলের মধ্যে সংগ্রহস্থলের মধ্যে অন্তর্ভুক্ত করতে চাইবেন যাতে অজান্তে কেউ আর অবিচ্ছিন্নভাবে git add foo.confনা পারে (এটি সম্ভব, তবে প্রয়োজন -f/ --force)। আপনার যদি একাধিক কনফিগারেশন ফাইল থাকে তবে আপনি সেগুলি একটি একক ডিরেক্টরিতে স্থানান্তরিত করা এবং পুরো জিনিসটিকে উপেক্ষা করে বিবেচনা করতে পারেন ('মুভিং' এর অর্থ প্রোগ্রামটি যেখানে কনফিগারেশন ফাইলগুলি আবিষ্কার করবে এবং ব্যবহারকারীদের পেতে পারে এমনটি পরিবর্তন করে) (বা ফাইলগুলি তাদের নতুন স্থানে অনুলিপি / সরাতে লঞ্চ / মোতায়েন করার পদ্ধতি); আপনি সম্ভবত এমভি কোনও ফাইলকে কোনও ডিরেক্টরিতে গিটিং করতে চান না যা আপনি উপেক্ষা করবেন)।


5
অবিশ্বাস্যভাবে সম্পূর্ণ প্রতিক্রিয়া। ধন্যবাদ!
ফ্ল্যাচার মুর

টম পাওয়ারের উত্তর, নীচে, আপনার প্রথম বাক্যটির বিরোধিতা করে।
মাইক এস

1
@ মাইকস: এর প্রভাব --{,no-}assume-unchangedখাঁটি স্থানীয়: এর রাজ্যটি সরাসরি কমিটে রেকর্ড করা হয় না। এটি কোনও সংগ্রহস্থলটিকে ফাইলটিতে নতুন পরিবর্তন করা থেকে বিরত রাখতে সহায়তা করতে পারে তবে এটি সংস্করণ নিয়ন্ত্রণ থেকে সরিয়ে দেয় না। যদি আপনি এটিকে আপনার সমস্ত প্রাসঙ্গিক, সম্পর্কিত, নন-বেয়ার স্টোরের জন্য সেট করতে পারেন তবে এটি আপনার পরিস্থিতিতে সহায়তা করতে পারে তবে এটি এমন কিছু নয় যা আপনি সরাসরি অন্য সম্পর্কিত, নন-বেয়ার রিপোজিটরিগুলিতে + টান / পুনরায় চাপ দিতে পারেন (বিশেষত এটি এই প্রশ্নটিতে মূল প্রশ্নকারীর স্পষ্টকারী মন্তব্য অনুসারে আপনি নিয়ন্ত্রণ করেন না: দেখুন "জনগণের সিস্টেমগুলি" / "বিদেশী সিস্টেমগুলি")।
ক্রিস জনসন

1
I do not think a Git commit can record an intention like “stop tracking this file, but do not delete it”.- এখন এটি করতে পারেgit rm --cached foo.conf
নিক ভলিনকিন

1
@ নিকভোলিনকিন: প্রশ্নটি ইতিমধ্যে ইঙ্গিত দিচ্ছে না যে এটি প্রশ্নকারীর উদ্দেশ্যটির জন্য অপর্যাপ্ত: (স্বয়ংক্রিয়ভাবে) ফলস্বরূপ প্রতিশ্রুতিটি অন্য ভাণ্ডারটিতে টানলে ফাইলটি চারপাশে রাখা?
ক্রিস জনসন

86

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

http://gitready.com/intermediate/2009/02/18/temporarily-ignoring-files.html

আমার পক্ষে ভাল কাজ করেছে এবং এখনও অবধি উল্লেখ করা হয়নি।

git update-index --assume-unchanged <file>

সংস্করণ নিয়ন্ত্রণ থেকে আপনার আগ্রহী ফাইলটি সরাতে, তারপরে আপনার অন্যান্য সমস্ত কমান্ড সাধারণ হিসাবে ব্যবহার করুন।

git update-index --no-assume-unchanged <file>

আপনি যদি এটি আবার রাখতে চান।

সম্পাদনা করুন: দয়া করে ক্রিস জনসন এবং কেপিএমের মন্তব্য দেখুন, এটি কেবল স্থানীয়ভাবে কাজ করে এবং অন্য ব্যবহারকারীরা যদি এটি না করে তবে এটি সংস্করণ নিয়ন্ত্রণে থাকে। গৃহীত উত্তর এটি মোকাবেলার জন্য আরও সম্পূর্ণ / সঠিক পদ্ধতি দেয়। এই পদ্ধতিটি ব্যবহার করে লিঙ্ক থেকে কিছু নোট:

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


7
উল্লিখিত নির্দিষ্ট সমস্যার জন্য এটি কোনও উত্তর নয়। এটি কেবলমাত্র আপনার নিজস্ব স্থানীয় সংগ্রহস্থলের জন্য কাজ করবে, সুতরাং প্রতিটি ব্যবহারকারীর নিজেরাই এটি করতে হবে। এটি একটি ব্যথা।
কেপিএম

28

সূচী থেকে ফাইলটি সরাতে, ব্যবহার করুন:

git reset myfile

এটি আপনার স্থানীয় অনুলিপি বা অন্য কারওর উপর প্রভাব ফেলবে না।


1
resetকেবলমাত্র ফাইলটি বর্তমানে প্রধান হেড প্রতিশ্রুতিতে না থাকলে কেবলমাত্র সূচি থেকে ফাইলটি সরিয়ে দেয়, অন্যথায় এটি সূচক সংস্করণটিকে বর্তমান হেড সংস্করণে রূপান্তরিত করে।
সিবি বেইলি

1
সম্ভবত আমি প্রশ্নটি ভুল বুঝেছি, তবে এটি কোনও কমিটকে প্রভাবিত না করে সূচক থেকে কোনও ফাইল সরিয়ে দেওয়ার সাথে সম্পর্কিত বলে মনে হচ্ছে।
আরমান্ড

যেমন চার্লস বলেছিলেন, পুনরায় সেট করা "কোনও ফাইল সরান" না। আরও তথ্যের জন্য গিট সহায়তা পুনরায় সেট করুন।
সাইমন বি।

4
এটি "কোনও ভাণ্ডার থেকে ফাইল মোছা না করে সূচি থেকে ফাইলটি কীভাবে সরানো যায়" শিরোনাম হিসাবে প্রশ্নের উত্তর দেয়। যদিও ওপি সত্যিই জিজ্ঞাসা করছিল "স্থানীয় কপিটি মুছে ফেলাতে আমি কীভাবে একটি ফাইল আনট্র্যাক করব?"
hewsonism

@ নিউজসনিজমে ওপি "কোনও ফাইল সিস্টেম" (কোনও সম্পাদনার আগেও) বলেছিল।
jbobbins


15

git rm --cachedকমান্ডটি করার পরে , ফাইলটিতে যুক্ত myfileকরার চেষ্টা .gitignoreকরুন (এটি উপস্থিত না থাকলে একটি তৈরি করুন)। এটি গিটকে উপেক্ষা করতে বলা উচিত myfile

.gitignoreফাইল, versioned তাই আপনি এটি কমিট এবং দূরবর্তী সংগ্রহস্থল থেকে এটি ধাক্কা প্রয়োজন হবে।


1

আমার সমাধানটি হ'ল অন্য কার্যকরী অনুলিপিটি টানুন এবং তারপরে:

git log --pretty="format:" --name-only -n1 | xargs git checkout HEAD^1

যা বলেছে সর্বশেষ মন্তব্যে সমস্ত ফাইল পাথ পান এবং হেডের পিতামাতার কাছ থেকে তাদের পরীক্ষা করে দেখুন। কাজ শেষ.


0

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

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

https://help.github.com/articles/remove-sensitive-data/

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

আপনার পরিবর্তনগুলি দেখার জন্য আপনাকে আপনার সংগ্রহস্থলের গিটহাব রুটে যেতে হবে এবং পৃষ্ঠাটি রিফ্রেশ করতে হবে। তারপরে লিঙ্কগুলির মাধ্যমে নেভিগেট করুন যে কোনও সময় ফাইলটি ছিল এমন পুরানো প্রতিশ্রুতিতে, এখন এটি সরিয়ে ফেলা হয়েছে তা দেখতে। আমার জন্য, কেবল পুরানো প্রতিশ্রুতিবদ্ধ পৃষ্ঠাটি রিফ্রেশ করা পরিবর্তনটি দেখায় নি।

এটি প্রথমে ভয়ঙ্কর লাগছিল, তবে সত্যই, সহজ ছিল এবং মনোমুগ্ধকর মতো কাজ করেছিল! :-)

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