গিট: উপস্থিত সমস্ত আনক্র্যাকযুক্ত ফাইলগুলিকে কীভাবে উপেক্ষা করবেন?


131

গিট সংগ্রহস্থলের সমস্ত অপ্রকাশিত ফাইল এবং ফোল্ডারগুলিকে উপেক্ষা করার কোন সহজ উপায় আছে?
(আমি জানি .gitignore।)

সুতরাং git statusআবার একটি পরিষ্কার ফলাফল প্রদান করবে।



অথবা আপনি আপনার .gitignore ফাইলে একটি * যুক্ত করতে চাইতে পারেন। :)
ভিলিকভেন

1
শুধু একটি *খুব সম্ভবত আপনি চান না।
sjas


এত ভুল উত্তর শুনে অবাক। -u noভূল. -unoসঠিক. -u noনামক কোনও ফাইলে স্ট্যাটাস দেওয়ার চেষ্টা করে no! noহয় না একটি যুক্তি -unoযুক্তি হিসাবে ব্যাখ্যা করতে বাধ্য করার জন্য -u, কোনও স্থান থাকতে হবে না। এটি পরীক্ষা করতে, করুন touch Invalidএবং তুলনা git status -uInvalidকরুন git status -u Invalid
অ্যারন ম্যাকডেইড

উত্তর:


251

ইতিমধ্যে বলা হয়েছে, স্থিতি থেকে বাদ দিতে কেবল ব্যবহার করুন:

git status -uno  # must be "-uno" , not "-u no"

পরিবর্তে আপনি যদি নিজের প্রকল্পের মূল থেকে শুরু করতে পারেন তবে বর্তমানে চিহ্নিত করা ফাইলগুলিকে স্থায়ীভাবে উপেক্ষা করতে চান, লঞ্চ করুন:

git status --porcelain | grep '^??' | cut -c4- >> .gitignore

পরবর্তী প্রতিটি কল git statusস্পষ্টভাবে এই ফাইলগুলিকে উপেক্ষা করবে।

আপডেট : উপরের কমান্ডটির একটি ছোটখাটো অসুবিধা রয়েছে: যদি আপনার কাছে .gitignoreফাইল না থাকে তবে আপনার গিটিগনোর নিজেই উপেক্ষা করবে! এটি ঘটায় কারণ এক্সিকিউট .gitignoreহওয়ার আগে ফাইলটি তৈরি হয়ে যায় git status --porcelain। সুতরাং আপনার কাছে যদি .gitignoreএখনও কোনও ফাইল না থাকে তবে আমি ব্যবহার করার পরামর্শ দিচ্ছি:

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore

এই subshell যা সমাপ্ত সৃষ্টি সামনে.gitignore ফাইল তৈরি করা হয়।

কমান্ড ব্যাখ্যা হিসাবে আমি ভোট অনেকটা পেয়ে করছি (তোমাকে ধন্যবাদ!) আমি মনে করি আমি ভাল কমান্ড একটু ব্যাখ্যা চাই:

  • git status --porcelainএর পরিবর্তে ব্যবহৃত হয় git status --shortকারণ ম্যানুয়াল জানিয়েছে "স্ক্রিপ্টগুলির জন্য সহজেই পার্সেল ফর্ম্যাটে আউটপুটটি দিন This এটি সংক্ষিপ্ত আউটপুটের মতো, তবে গিট সংস্করণ জুড়ে স্থিতিশীল থাকবে এবং ব্যবহারকারী কনফিগারেশন নির্বিশেষে।" সুতরাং আমাদের উভয় পার্সিবিলিটি এবং স্থিতিশীলতা রয়েছে;
  • grep '^??'গিটার স্থিতি ম্যানুয়াল?? অনুসারে , কেবল চিহ্ন ছাড়াই শুরু হওয়া লাইনগুলি ফিল্টার করে;
  • cut -c4- প্রতিটি লাইনের প্রথম 3 টি অক্ষর সরিয়ে দেয়, যা আমাদের অচিহ্নযুক্ত ফাইলের জন্য কেবল আপেক্ষিক পথ দেয়;
  • |প্রতীক পাইপ , যা নিম্নলিখিত কমান্ডের ইনপুট পূর্ববর্তী কমান্ডের আউটপুট পাস;
  • >>এবং >চিহ্ন পুনর্নির্দেশ অপারেটার , যা একটি ফাইল বা মুছে ফেলা হয় আগের কমান্ডের আউটপুট যোগ / যথাক্রমে একটি নতুন ফাইল তৈরি করে।

যারা পরিবর্তে ব্যবহার করতেsed পছন্দ করেন তাদের জন্য অন্য কোনও বৈকল্পিকgrep এবং cut, এখানে আরও একটি উপায় রয়েছে:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore

3
cut -c4- প্রতিটি লাইনের প্রথম 4 টি অক্ষর সরিয়ে দেয়, যা আমাদের তালিকার চিহ্নবিহীন ফাইলের কেবলমাত্র আপেক্ষিক পথ দেয়; নংটি -cকাটাতে কলাম সংখ্যার তালিকার সূচনা চিহ্নিত করে। এবং কলাম 4 থেকে শেষ পর্যন্ত লাইনটি 4- নির্বাচন করে, যা কলামগুলিকে 1-3 কেটে ফেলে। সুতরাং আপনার কাট কমান্ডটি প্রতিটি লাইনের প্রথম 3 টি অক্ষরকে সরিয়ে দেয়। আপনি যদি এখানে এই ফাইলটির জন্য একটি গিট স্ট্যাটাস লাইন থেকে 4 টি অক্ষর অপসারণ করেছেন:, ?? app/views/static_pages/contact.html.erbআপনি প্রথম অক্ষরটি সরিয়ে ফেলবেন app। সুতরাং কমান্ডটি সঠিক, তবে ব্যাখ্যাটি ত্রুটিযুক্ত।
7stud

@ 7 স্টুদ: আপনাকে ধন্যবাদ, আপনি ঠিক বলেছেন, আমি ভুল করে 4 লিখেছি। আমি উত্তর ঠিক করেছি।
ডিয়েগো

2
কমান্ডের ব্যাখ্যাটি আমি সত্যই প্রশংসা করি। আমি ইন্টারনেট থেকে অনুলিপি করা কমান্ডগুলি কী করছে তা জানতে পেরে খুব ভাল লাগছে এবং আমাদের সকলকে কীভাবে কমান্ড লাইনটি ব্যবহার করতে হয় এবং আরও ভালভাবে গিট করতে সহায়তা করে।
এরিক ফিটিং

1
-u noআমার জন্য কাজ করে না। কিন্তু -unoনা। আমি সেই অনুযায়ী উত্তর আপডেট করেছি। এটি গিটের জন্য অদ্ভুত নকশা। আমি 1.7.1 গিটে আছি
অ্যারন ম্যাকডেইড

2
@ অ্যারোন এমসিডিড: ধন্যবাদ পরিবর্তন নথিভুক্ত করা এখানে , এবং আলোচনা এখানে
দিয়েগো

51

আপনি যদি এই ফাইলগুলিকে স্থায়ীভাবে উপেক্ষা করতে চান তবে এগুলিতে যুক্ত করার একটি সহজ উপায় .gitignoreহ'ল:

  1. গিট গাছের গোড়ায় পরিবর্তন করুন।
  2. git ls-files --others --exclude-standard >> .gitignore

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


3
কেন এটি এত ভোট পায় না? অন্য 2 টি প্রোগ্রামের মাধ্যমে পাইপের দরকার নেই!
জোয়েলফ্যান

4
@ জোয়েলফ্যান: দুটি কারণ: ১) এইটি কেবল গিটের মূল থেকে কাজ করে , যখন স্বীকৃত .gitignoreব্যক্তিটি প্রতিটি উপ-ডিরেক্টরি থেকে কাজ করে তবে আপনাকে কেবল গন্তব্য পথটি টুইঙ্ক করতে হবে 2) যদি আপনার কোনও অনিবন্ধিত ডিরেক্টরি থাকে তবে এই তালিকাটি প্রতিটি এবং এতে প্রতিটি ফাইল থাকে না, তবে তালিকাহীন ডিরেক্টরিটি নিজেই নয় (সুতরাং আপনি ডিরেক্টরিটিকে অগ্রাহ্য করবেন না এবং এভাবে ডিরেক্টরিতে ভবিষ্যতের ফাইলগুলি ট্রেড না করা হিসাবে পাওয়া যাবে, যখন স্বীকৃত একটি কেবল ডিরেক্টরিতে তালিকাবদ্ধ করে, এবং ভিতরে তালিকৃত ফাইলগুলি নয় এটি আপনি যা করতে চান তা একটি বিষয়, তবে প্রায়শই আপনি কেবল পুরো দিরটিকে উপেক্ষা করতে চান
ডিয়েগো

1
আপনাকে ধন্যবাদ Poolie আমি পার্থক্য তারিফ এর আপনার পরামর্শের কারণ শুরু পয়েন্ট @Diego আমি উল্লেখ ফাইল এবং ফোল্ডারগুলি একটি লাইব্রেরি সঙ্গে কাজ এবং আমি ট্র্যাক / মূল ফাইল ধাক্কা চাই না। আমি কেবল লাইব্রেরিতে যুক্ত করা বা পুনর্নির্মাণ করা ফাইলগুলি ট্র্যাক করতে চাই। প্যারেন্ট ফোল্ডারগুলি যুক্ত করা সমস্ত কিছু উপেক্ষা করবে। এটি / আপনার সমাধানটিতে সমস্ত 1696 ফাইল স্ন্যাপে যুক্ত হয়েছে। এক্সডি
কেওস 7703

এটি ব্যবহার করেও অর্জন করা যায় git config status.showUntrackedFiles no
লার্শ

16

এটি ম্যানুয়ালটিতে পাওয়া গেছে

মোড প্যারামিটারটি চিহ্নবিহীন ফাইলগুলির হ্যান্ডলিং নির্দিষ্ট করতে ব্যবহৃত হয়। এটি বিকল্প:

git status -uno


39
আচ্ছা যদি সবাই পোস্ট করার আগে আরটিএফএম করত তবে আমাদের কারওই কোনও রেপ পাওয়া যাবে না :-)
জেনি ডি

4

দুইটি রাস্তা:

গিট-স্ট্যাটাসের জন্য "-uno" যুক্তিটি ব্যবহার করুন। এখানে একটি উদাহরণ:

[jenny@jenny_vmware:ft]$ git status
# On branch ft
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       foo
nothing added to commit but untracked files present (use "git add" to track)
[jenny@jenny_vmware:ft]$ git status -uno
# On branch ft
nothing to commit (working directory clean)

অথবা আপনি .gitignore এ ফাইল এবং নির্দেশিকা যুক্ত করতে পারেন, সে ক্ষেত্রে তারা কখনই প্রদর্শিত হবে না।


2
.gitignoreসত্তাকে সম্পাদনার এক সহজ উপায় git status | cat >> temp && vim temp। তারপরে ফাইলটি সম্পাদনা করুন যাতে প্রথম কয়েকটি লাইন এবং শেষ লাইন মুছে ফেলা হয়, পাশাপাশি ট্রেলিং #এবং তার পরে সাদা স্থান p তারপরে cat temp >> .gitignore && rm temp। ক্ষেত্রে .gitignoreআগে উপস্থিত ছিল না, mv temp .gitignoreকরবে। কুরুচিপূর্ণ স্টাফ তবে .gitignoreম্যানুয়ালি আপডেট করার চেয়ে ভাল ।
sjas

1
এই উত্তরটি ভুল। সঠিক উত্তরটি হ'ল -uno। আপনি যদি -u noএটি ব্যবহার করেন তবে এটি সমান no -u- এটি কোনও ফাইল no(যা সম্ভবত উপস্থিত নেই) এর স্থিতি করবে এবং ডিফল্ট -uমোডটি ব্যবহার করবে । যেমন এটি সমানgit status no
হারুন ম্যাকডেইড

3

-u noস্টেস্টেড ফাইলগুলি দেখায় না। -unoপছন্দসই হিসাবে কাজ করে এবং অযৌক্তিকরূপে দেখায় তবে তালাবদ্ধ না করে লুকিয়ে রাখে।


1
এমনকি এটি পুরোপুরি সঠিক নয়। git status -u Xএর সমতুল্য git status X -u( Xএটি কোনও যুক্তি নয় -u)। এটি, পরিবর্তে, সমান git status X(কারণ -uযুক্তি ছাড়াই ডিফল্ট হয় -u) is অতএব, এটি কেবল ফাইলে একটি গিট-স্ট্যাটাস X। সুতরাং, যদি Xহয় noএটা শুধু নামক একটি ফাইল-এ একটি Git অবস্থা কি করার চেষ্টা করে no, যা আপনি সম্ভবত হবে না
হারুন McDaid

2

আপনি যদি ওএসের মতো ইউনিক্সে না থাকেন তবে পাওয়ারশেল ব্যবহার করে এটি উইন্ডোতে কাজ করবে

git status --porcelain | ?{ $_ -match "^\?\? " }| %{$_ -replace "^\?\? ",""} | Add-Content .\.gitignore

তবে .gitignoreফাইলের একটি নতুন খালি লাইন থাকতে হবে, অন্যথায় এটি লিখিত বিষয়বস্তু না থাকলে শেষ পংক্তিতে পাঠ্য সংযোজন করবে।

এটি আরও ভাল বিকল্প হতে পারে:

$gi=gc .\.gitignore;$res=git status --porcelain|?{ $_ -match "^\?\? " }|%{ $_ -replace "^\?\? ", "" }; $res=$gi+$res; $res | Out-File .\.gitignore


1

আপনার কাছে যদি অনেকগুলি অনতিবহির্ভূত ফাইল রয়েছে এবং gitignoreসেগুলি " " সমস্তই না চান , তবে নোট করুন যে, যেহেতু গিট 1.8.3 (এপ্রিল, 22 শে 2013) , আপনি সেই বিকল্পটি যোগ না করেও git statusউল্লেখ --untracked-files=noকরবেন প্রথম স্থান!

" git status" ব্যবহারকারীরা --untracked=noযখন খুব বেশি সময় নেয় তখন বিকল্পটি ব্যবহার করার জন্য পরামর্শ দেয় ।


0

আমি কিছুটা ভিন্ন সমস্যা সমাধানের চেষ্টা করে এখানে এসেছি। হতে পারে এটি অন্য কারও পক্ষে কার্যকর হবে:

আমি একটি নতুন শাখা তৈরি feature-a। এই শাখার অংশ হিসাবে আমি নতুন ডিরেক্টরি তৈরি করি এবং তাদের কয়েকটিকে দমন করার জন্য .gitignore সংশোধন করতে হবে। এমন প্রকল্পে নতুন সরঞ্জাম যুক্ত করার সময় অনেক কিছুই ঘটে যা বিভিন্ন ক্যাশে ফোল্ডার তৈরি করে। .serverless, .terraformইত্যাদি

আমি আবার মাস্টারটিতে মার্জ হওয়ার জন্য প্রস্তুত হওয়ার আগে আমার আরও কিছু উপস্থিতি এসেছিল, তাই আমি masterআবারও চেকআউট করব , কিন্তু এখন git statusসেই দমন করা ফোল্ডারগুলি আবার তুলে নিয়েছে, যেহেতু .gitignore এখনও মেশানো হয়নি।

এখানে উত্তরটি আসলেই সহজ, যদিও এটি খুঁজে পেতে আমাকে এই ব্লগটি খুঁজে পেতে হয়েছিল:

কেবল feature-aশাখা থেকে .gitignore ফাইলটি চেকআউট করুন

git checkout feature-a -- feature-a/.gitignore
git add .
git commit -m "update .gitignore from feature-a branch"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.