গিটকে উপেক্ষা করা ডিরেক্টরিগুলির সাব-ডাইরেক্টরিগুলিকে স্বাক্ষর করুন


103

ধরা যাক আমি একটি ডিরেক্টরিকে অগ্রাহ্য করেছি, তবে আমি সেখানে নির্দিষ্ট সাব-ডাইরেক্টরিগুলিকে স্বাক্ষর করতে চাই। সুতরাং আমি সেটআপ আছে:

/uploads/
/uploads/rubbish/
/uploads/rubbish/stuff/KEEP_ME/
/uploads/foo/
/uploads/foo/bar/lose/

এবং আমি KEEP_MEডিরেক্টরি বাদে সবকিছু উপেক্ষা করতে চাই । আমি আশা করব যে উপেক্ষা এটিকে কিছু দেখতে দেবে:

/uploads/*
!/uploads/rubbish/stuff/KEEP_ME/

তবে এটি কাজ করছে না এবং একই থিমের জন্য বেশ কয়েকটি অনুমতিও নেই।

এক যে কাজ করে

/uploads/**/**/**/
!/uploads/rubbish/stuff/KEEP_ME/

তবে কি কিছুটা নিয়ন্ত্রিত এবং ভার্জিক মনে হচ্ছে?


4
আপনার প্রদত্ত কোডটি আমার পক্ষে কার্যকর হয়নি (গিট সংস্করণ 1.9.1 ব্যবহার করে)। যেগুলি কাজ করেছে তা হ'ল / আপলোড / *! / আপলোডস / আবর্জনা / / আপলোডস / জঞ্জাল / *! / আপলোডস / আবর্জনা / স্টাফ / আপলোডস / আবর্জনা / স্টাফ / *! / আপলোডস / আবর্জনা / স্টাফ / কিপ (যা উদাহরণের মতো মধ্যে git-scm.com/docs/gitignore )। আমার ফোল্ডার স্ট্রাক্ট; └ README.md └ আপলোডগুলি / ফু / বার / হারান / হারান। টেক্সট └ আপলোডগুলি / আবর্জনা / স্টাফ / রাখুন / রাখুন.টিএসটি
গিহানচানাচ

উত্তর:


120

গিটিগনোর ডকুমেন্টেশনের প্যাটার্ন ফর্ম্যাট বিভাগ অনুযায়ী :

একটি alচ্ছিক উপসর্গ "!" যা প্যাটার্ন অবহেলা করে; আগের প্যাটার্ন দ্বারা বাদ দেওয়া কোনও মিলে যাওয়া ফাইল আবার অন্তর্ভুক্ত হবে। যদি সেই ফাইলটির কোনও পিতামাতাকে বাদ দেওয়া হয় তবে কোনও ফাইল পুনরায় অন্তর্ভুক্ত করা সম্ভব নয়। কার্য সম্পাদনের কারণে গিট বাদ দেওয়া ডিরেক্টরিগুলি তালিকাভুক্ত করে না, সুতরাং এতে থাকা ফাইলগুলিতে যে কোনও প্যাটার্নের কোনও প্রভাব নেই, সেগুলি নির্ধারিত যেখানেই হোক না কেন। প্রথম "এর সামনে একটি ব্যাকস্ল্যাশ (" \ ") রাখুন!" আক্ষরিক "!" দিয়ে শুরু হওয়া নিদর্শনগুলির জন্য, উদাহরণস্বরূপ, "! গুরুত্বপূর্ণ! .txt"।

অতএব পূর্ব-বাদ দেওয়া পিতৃ ডিরেক্টরি /uploads/rubbish/stuff/keep/প্যাটার্নটিকে অবশ্যই এর বিষয়বস্তুটিকে উপেক্ষা করার আগে একচেটিয়াভাবে উপেক্ষা করতে হবে:

#ignore everything within /uploads/ 
/uploads/*

#include everything within /uploads/rubbish/stuff/keep
!/uploads/rubbish/stuff/keep/  
!/uploads/rubbish/stuff/keep/*

ভিতরে উপ-ডিরেক্টরি অন্তর্ভুক্ত করতে /uploads/rubbish/stuff/keep/তৃতীয় লাইন যুক্ত করুন:

!/uploads/rubbish/stuff/keep/**/*

4
আপনি গিটের কোন সংস্করণ ব্যবহার করছেন? সম্ভবত এটি কিছু নির্দিষ্ট সংস্করণে উপলভ্য।

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

আমার কাছে একটি গ্লোবাল গিটিগনোর ফাইল রয়েছে যেখানে আমি সমস্ত * .zip ফাইল উপেক্ষা করেছি। তবুও একটি নির্দিষ্ট প্রকল্পের জন্য, আমি জিপ ফাইলগুলি অন্তর্ভুক্ত করতে চাই। আমি এই প্রকল্পটির লাইনে এই লাইনটি যুক্ত করেছি .gitignoreএবং এটি দুর্দান্ত কাজ করে !:!*.zip
জিঙ্গাও শি

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

এই পদ্ধতিটি কাজ করে না (গিট ২.২৫ হিসাবে - সম্ভবত গিটের কিছু পরিবর্তিত হয়েছে)। আমি সংশোধন হিসাবে নীচে stackoverflow.com/a/60288435/295691 পোস্ট করেছি ।
ব্যবহারকারী 295691

35

এমনকি আপনি এতে কিছু যুক্ত করলেও আপনি গিটকে এটিকে সূচীতে যুক্ত .gitignoreকরতে বাধ্য করতে পারেন

git add --force uploads/rubbish/stuff/KEEP_ME/

তবে "KEEP_ME" একটি ডিরেক্টরি বলে মনে হচ্ছে এবং গিটটি সাধারণত খালি ফোল্ডার পছন্দ করে না, সুতরাং ফোল্ডারটি খালি থাকলে আপনার পরিবর্তে একটি "স্থানধারক" -হোল্ডার ফাইল যুক্ত করতে হবে

git add --force uploads/rubbish/stuff/KEEP_ME/.keep_me

এটির সাথে একমাত্র সমস্যাটি হ'ল এই নির্দিষ্ট উদাহরণটি একটি গ্লোবাল গিটিগনোরকে বোঝায় যা আমার উল্লেখ করা উচিত ছিল। আমি জানি যে আমি আইটেমগুলি যুক্ত করতে বাধ্য করতে পারি, তবে আমার এটি করতে হবে যদি কোনও নতুন আইটেম যুক্ত করা হয়, পাশাপাশি প্রাথমিকভাবে প্রতিটি নতুন সংগ্রহস্থলের জন্য। .কি নিশ্চিত করে যে বিষয়বস্তু উপেক্ষা করা হয়নি?
উইল

4
একটু পরীক্ষা করল। হ্যাঁ, আপনাকে git add --forceপ্রতিটি নতুন আইটেম বা ফোল্ডারের জন্য ব্যবহার করতে হবে KEEP_ME। তবে তার পরে, আপডেটগুলি কেবল যুক্ত হয় ( git add -uউদাহরণস্বরূপ যখন করা হয় ) যেন ফাইলগুলি 'আনইনগ্রেড' থাকে। .keep_meযাতে Git ফোল্ডারে পরিচালনা কিছুই, তার ঠিক একটি ফাইল আছে।
কমনপাইক

4
git add --forceএটির জন্য ভুল সমাধান। আপনি যদি কোনও ডিরেক্টরি ঘুরে দেখেন বা ফাইলটিকে অন্য ডিরেক্টরিতে স্থানান্তরিত করেন তবে গিটের ট্র্যাকিং ফাইলটি মুছে ফেলা হবে তবে নতুন জায়গায় যুক্ত করবে না এবং আপনাকে git add --forceআবার করতে হবে । জেনেরিক প্যাটার্নে স্বাক্ষর করে, গিট রেপোর মধ্যে একটি ফাইলের চলাফেরার উপর নজর রাখবে।
মার্লিন

এটি আমার পক্ষে কাজ করা একমাত্র সমাধান। আমার ফোল্ডারটি উপেক্ষা করা হয়নি, তবে আমি কোনও উপায়ে এটি যুক্ত করতে পারি নি। এইভাবে এটি আমার জন্য সমাধান।
আকিতো

6

জেনেরিক বাদ দিয়ে সমস্ত ফোল্ডার বাদ দিলে কীভাবে একটি নির্দিষ্ট ফোল্ডার অন্তর্ভুক্ত করা যায় তা নির্ধারণের চেষ্টা করা হয়েছিল

**/build

যদি আপনি /*আপনার জেনেরিক বাদ দেওয়ার শেষে যোগ করেন তবে আপনি সমস্ত বিল্ড ফাইল বাদ দিতে পারেন**/build/*

তারপরে আপনি যে পথটির মতো দেখতে অন্তর্ভুক্ত থাকতে চান তার জন্য আপনি আর একটি লাইন যুক্ত করেছেন

!**/folder/build/* 

আমাদের পড়ছে একটি গিটিগনোর রেখে

**/build/* 
!**/folder/build/* 

4

বুও-রেন লিন এবং জন এর উত্তরগুলি বেশ সহায়ক, তবে আমার উভয়কে একত্রিত করা দরকার।

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

**/uploads/*
!**/uploads/rubbish/
!**/uploads/rubbish/*

আমি ফোল্ডার এবং সাব-ফোল্ডারগুলির মধ্যে উভয় আইটেম দেখানোর জন্য সাব-ফোল্ডার এবং এর বিষয়বস্তুগুলি স্পষ্টতই পুনরায় অন্তর্ভুক্ত করার প্রয়োজনীয়তা পেয়েছি।


দীর্ঘশ্বাস. এখানে শূন্য ভাগ্য। এটি এখন ঘন্টা জন্য। গিট 2.20.1
রিচিএইচএইচ

@ হারমান এএইচ শুনে দুঃখিত। সম্ভবত এখন নতুন প্রশ্ন জিজ্ঞাসা করার সময় এসেছে?
জোশিয়ার যোদার

3

সর্বাধিক উত্সাহিত উত্তর হিসাবে উপস্থাপিত সমাধানটি ভুল, এবং সহজেই এর মতো প্রদর্শিত হতে পারে।

আপলোডগুলিতে সবকিছু উপেক্ষা করে শুরু করুন / *:

mkdir -p uploads/rubbish/stuff/KEEP_ME
touch uploads/a uploads/rubbish/a uploads/rubbish/stuff/a uploads/rubbish/stuff/KEEP_ME/a
echo '/uploads/*' >> .gitignore
git init
git add .
git commit -m "Initial commit"

এখন উপরের মতো উপেক্ষা করা স্টাফগুলির মূল ডিরেক্টরিটি স্বাক্ষর করুন:

echo 'uploads/rubbish/stuff/KEEP_ME/' >> .gitignore
echo 'uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u

কোনও চিহ্নবিহীন ফাইল নেই ows

এটি কাজ করতে পেতে, আপনাকে uploads/গাছের নীচে সমস্ত ফাইল উপেক্ষা করতে হবে ( uploads/**/*কেবল শীর্ষ স্তর নয়, uploads/*) এবং তারপরে আপনি যে গাছটি রাখতে চান তার সমস্ত পিতামহক ডিরেক্টরি যুক্ত করতে হবে

echo '/uploads/**/*' > .gitignore
echo '!/uploads/rubbish/' >> .gitignore
echo '!/uploads/rubbish/stuff' >> .gitignore
echo '!/uploads/rubbish/stuff/KEEP_ME' >> .gitignore
echo '!/uploads/rubbish/stuff/KEEP_ME/*' >> .gitignore
git status -u

যা দেয়:

On branch master
...
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        uploads/rubbish/stuff/KEEP_ME/a

আমরা যদি ব্যবহার করেছিল uploads/*মধ্যে .gitignoreউপরে, তারপর সব অন্তর্বর্তী ফাইল হিসেবে ভাল, সুতরাং উদাহরণস্বরূপ অন্তর্ভুক্ত করা হত uploads/rubbish/aআপ উপরে অবস্থা কমান্ড দেখানো হবে।

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