.Gitignore বর্জন বিধি আসলে কীভাবে কাজ করে?


146

আমি একটি বৃহত ডিরেক্টরি স্ট্রাকচারে একটি গিটিগনোর সমস্যা সমাধানের চেষ্টা করছি, তবে আমার প্রশ্নটি সহজ করার জন্য আমি এটিকে নীচে কমিয়ে দিয়েছি।

আমার কাছে একটি ব্র্যান্ডের নতুন গিট রিপোজিটরিতে দুটি ফাইলের (ফু, বার) নীচের ডিরেক্টরি কাঠামো রয়েছে (এখন পর্যন্ত কোন কমিট করেনি):

a/b/c/foo
a/b/c/bar

স্পষ্টতই, 'গিট স্ট্যাটাস -u' দেখায়:

# Untracked files:
...
#       a/b/c/bar
#       a/b/c/foo

আমি যা করতে চাই তা হ'ল একটি .gitignore ফাইল তৈরি করা যা একটি / বি / সি এর ভিতরে থাকা সমস্ত কিছুকে উপেক্ষা করে তবে 'foo' ফাইলটিকে উপেক্ষা করে না।

যদি আমি এইভাবে একটি .gitignore তৈরি করি:

c/

তারপরে একটি 'গিট স্ট্যাটাস -u' foo এবং বার উভয়ই উপেক্ষা হিসাবে দেখায়:

# Untracked files:
...
#       .gitignore

যা আমি প্রত্যাশা হিসাবে।

এখন যদি আমি foo এর জন্য একটি বর্জনীয় নিয়ম যুক্ত করি তবে:

c/
!foo

গিটিগনোর ম্যানপেজ অনুসারে, আমি এটি কাজ করবে আশা করি। তবে তা হয় না - এটি এখনও ফু উপেক্ষা করে:

# Untracked files:
...
#       .gitignore

এটিও কাজ করে না:

c/
!a/b/c/foo

এটিও করে না:

c/*
!foo

দেয়:

# Untracked files:
...
#       .gitignore
#       a/b/c/bar
#       a/b/c/foo

সেক্ষেত্রে, foo আর উপেক্ষা করা হবে না, বার এছাড়াও উপেক্ষা করা হয় না।

.Gitignore এ নিয়মগুলির ক্রমটি তেমন গুরুত্বপূর্ণ বলে মনে হচ্ছে না।

এটি আমি যা প্রত্যাশা করে তা করে না:

a/b/c/
!a/b/c/foo

যে একটি foo এবং বার উভয় উপেক্ষা।

একটি পরিস্থিতি যা কাজ করে তা হ'ল যদি আমি ফাইলটি একটি / বি / সি / .gitignore তৈরি করে সেখানে রাখি:

*
!foo

তবে এটির সাথে সমস্যাটি হ'ল অবশেষে একটি / বি / সি এর অধীনে অন্যান্য উপ-ডিরেক্টরি থাকবে এবং আমি এককটিতে একটি পৃথক .gitignore লাগাতে চাই না - আমি 'প্রকল্প-ভিত্তিক' তৈরি করার আশা করছিলাম। Gitignore ফাইলগুলি যা প্রতিটি প্রকল্পের শীর্ষ ডিরেক্টরিতে বসতে পারে এবং সমস্ত 'স্ট্যান্ডার্ড' সাব-ডাইরেক্টরি কাঠামোকে আবরণ করতে পারে।

এটিও সমতুল্য বলে মনে হচ্ছে:

a/b/c/*
!a/b/c/foo

এটি "কাজ" করার সবচেয়ে কাছের জিনিস হতে পারে যা আমি অর্জন করতে পারি তবে সম্পূর্ণ আপেক্ষিক পাথ এবং স্পষ্ট ব্যতিক্রমগুলি উল্লেখ করা দরকার, যা আমার কাছে বিভিন্ন স্তরে 'foo' নামের প্রচুর ফাইল থাকলে ব্যথা হতে চলেছে উপ-ডিরেক্টরি গাছ

যাইহোক, হয় না আমি বহিরাগতকরণের নিয়মগুলি কীভাবে কাজ করে তা পুরোপুরি বুঝতে পারি না বা ডিরেক্টরিগুলি (ওয়াইল্ডকার্ডের চেয়ে) উপেক্ষা করা হলে সেগুলি মোটেই কাজ করে না - একটি নিয়মে /

কেউ দয়া করে এ সম্পর্কে কিছু আলোকপাত করতে পারেন?

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

আমি এটি সাইগউইন / বাশ 3-তে গিট-১..1..6.১ এবং উবুন্টু / বাশ ৩-এ গিট-১.7.১ সহ ব্যবহার করছি এবং পর্যবেক্ষণ করছি।



4
দুর্দান্তভাবে লেখা প্রশ্ন! আপনি যে পরিমাণ মামলার চেষ্টা করেছেন তা আমাকে বুঝতে অনুরোধ করেছিল যে আমার অনুরূপ ক্ষেত্রে আমি কী ভুল করছি। Godশ্বরকে ধন্যবাদ, আমি আজ অনেকক্ষণ ধরে খুঁজছিলাম।
অ্যালেক্স জি

উত্তর:


153
/ একটি / বি / সি / *
! foo বিন্যাস

আমার জন্য কাজ করে মনে হচ্ছে (লিনাক্সে 1.7.0.4 গিট)। *গুরুত্বপূর্ণ অন্যথায় হিসাবে আপনি ডিরেক্টরি নিজেই (তাই Git ভিতরে চেহারা হবে না) পরিবর্তে ফাইল ডিরেক্টরি মধ্যে (যা বর্জন জন্য করতে পারবেন) উপেক্ষা করছি।

"" তবে "এটি" না বলে "বরং এইটিকে অন্তর্ভুক্ত করুন" বলে বাদ দেওয়ার কথা চিন্তা করুন - "এই ডিরেক্টরিটিকে উপেক্ষা করুন ( /a/b/c/) তবে এইটিকে নয় ( foo)" খুব একটা বোঝায় না; "এই ডিরেক্টরিতে ( /a/b/c/*) এর সমস্ত ফাইল উপেক্ষা করুন তবে এটি ( ) নয় foo"। ম্যান পৃষ্ঠাটি উদ্ধৃত করতে:

একটি alচ্ছিক উপসর্গ! যা প্যাটার্ন অবহেলা করে; আগের প্যাটার্ন দ্বারা বাদ দেওয়া কোনও মিলে যাওয়া ফাইল আবার অন্তর্ভুক্ত হবে।

অর্থাৎ, ফাইলটি আবার অন্তর্ভুক্ত করার জন্য ইতিমধ্যে বাদ দেওয়া উচিত to আশা করি কিছুটা আলো ফেলেছে।


হ্যাঁ, আপনি যে উদাহরণ দেন তা আমার পক্ষেও কার্যকর। সমস্যাটি হ'ল foo সিতে থাকলে / / a / b / * কাজ করে না, যার অর্থ সি এর অধীনে বিভিন্ন উপ-ডিরেক্টরিতে আমার একাধিক foo ফাইল থাকে (যেমন, d /, e /, f / g / h /, i / j /, ইত্যাদি) তারপরে 'না!
ডেভিডা

1
পছন্দ করুন যদি আপনি / a / b / * উপেক্ষা করেন তবে foo- তে থাকার কোনও ডিরেক্টরি নেই! আপনি যদি / ডিরেক্টরিতে পুরো ডিরেক্টরি গাছটিকে উপেক্ষা করার চেষ্টা করছেন তবে গাছের যে কোনও জায়গায় "foo" নামের যে কোনও ফাইল অন্তর্ভুক্ত থাকতে পারে, আমি মনে করি না এটি .gitignore নিদর্শনগুলি সহকারে করণীয়:
Chris

আসলে এটি ব্যাখ্যা করতে পারে কেন এটি আমার পক্ষে কাজ করে না - নিম্নলিখিত নিয়মগুলি কাজ করে না: "/ a / b / *", "! C / foo"। যদি এটি কাজ করে তবে সমস্যা হতে পারে না।
ডেভিডা

5
"আমি মনে করি না এটি .gitignore নিদর্শনগুলির সাথে করণীয়যোগ্য" - আমার মনে হয় দুর্ভাগ্যক্রমে আপনি ঠিক বলেছেন।
ডেভিডা

@ মেসোস্কাক আপনি সম্ভবত উপেক্ষা করতে পারেন /a/b/cএবং তারপরে git add --forceকোনও মিলে যাওয়া ফাইলের প্রাক-কমিট বা কোনও কিছুতে একটি হুক লিখতে পারেন
ক্রিস

24

আমারও একই অবস্থা, আমার সমাধানটি ব্যবহার করা ছিল:

/a/**/*
!/a/**/foo

যদি আমি **সঠিকভাবে পড়ি তবে এটি মধ্যবর্তী ডিরেক্টরিগুলির একটি স্বেচ্ছাসেবী সংখ্যার জন্য কাজ করা উচিত ।


6

এটি .gitignore ম্যান পৃষ্ঠা থেকে অবশ্যই স্পষ্ট নয়। এইটা কাজ করে:

*
!/a
!/a/b
!/a/b/c
!/a/b/c/foo

# don't forget this one
!.gitignore

ক্রিস দ্বারা উল্লিখিত হিসাবে কোনও ডিরেক্টরি এটি বাদ না দিলেও খোলা হয় না। সুতরাং আপনি * তবে কিছু ফাইল উপেক্ষা করতে সক্ষম হতে চাইলে আপনাকে উপরের মতো সেই ফাইলগুলির পথ তৈরি করতে হবে। আমার জন্য এটি সুবিধাজনক, কারণ আমি একটি লাইব্রেরির ১ টি ফাইলে কোড পর্যালোচনা করতে চাই এবং পরে যদি আমি আরও কিছু করতে চাই তবে আমি কেবল এটি যুক্ত করব এবং অন্য সব উপেক্ষা করা হবে।


6

এখানে আরও একটি বিকল্প রয়েছে:

*
!/a*
!/a/*
!/a/*/*
!/a/*/*/*

এটি প্রতিটি ফাইল এবং ডিরেক্টরিকে উপেক্ষা করবে, এ / এর মধ্যে তিনটি স্তর গভীরভাবে ফাইল / ডিরেক্টরিগুলি বাদ দিয়ে।


5

একটি সাধারণ নোট অন, git1.8.2 অন্তর্ভুক্ত করা হবে প্যাচ (এছাড়াও তার V4 মধ্যে , কিছু স্ট্যাক ওভারফ্লো প্রশ্নের অনুরোধ জানানো থেকে) আদম চূড়া নির্ধারণের বিষয়ে gitignoreনিয়ম আসলে আপনার ফাইল উপেক্ষা করে।

দেখুন git1.8.2 রিলিজ নোট এবং তাই প্রশ্ন " যা gitignore নিয়ম আমার ফাইল উপেক্ষা করা হয় ":
যে কমান্ড হতে হবে git check-ignore


1
এই তথ্য সম্প্রচারের জন্য ধন্যবাদ। check-ignoreযদি এটি হয় তবে কোন নিয়ম আপনার ফাইলটিকে উপেক্ষা করা থেকে বাধা দিচ্ছে।
অ্যাডাম স্পায়ার্স

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