.gitignore সিনট্যাক্স: বিন বনাম বিন / বনাম বিন / * বনাম বিন / **


90

যোগ মধ্যে পার্থক্য কি bin, bin/, bin/*এবং bin/**আমার .gitignore ফাইলে? আমি ব্যবহার করছি bin/, কিন্তু এ খুঁজছেন অন্যান্য .gitignore ফাইল (ইন অন্ধকার ফাইল ডবল এবং একক তারকা এমনকি একসাথে ভালো ব্যবহার করা হয়: tmp/**/*কি যে সঙ্গে আপ) আমি দেখতে যে প্রথম দুই নিদর্শন ব্যাপকভাবি পাশাপাশি ব্যবহার করা হয়। কেউ দয়া করে তিনজনের মধ্যে পার্থক্য ব্যাখ্যা করতে পারেন?


4
@ ইউনতবু: এই প্রশ্নের গৃহীত উত্তর আপাতদৃষ্টিতে বিতর্কিত। শীর্ষ মন্তব্যগুলির মধ্যে একটি দাবি করে যে উত্তরটি আসলে একটি সম্পূর্ণ মিথ।
চ্যান্সডি

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

উত্তর:


85

bin'বিন' নামের কোনও ফাইল বা ডিরেক্টরি মেলে ।

bin/'বিন' নামের যে কোনও ডিরেক্টরিকে মিলছে , এর ফলস্বরূপ এর সমস্ত বিষয়বস্তু মানে গিট যেহেতু গিট একাই ডিরেক্টরিগুলি ট্র্যাক করে না।

bin/*সমস্ত ফাইল এবং ডিরেক্টরি সরাসরি যে কোনও সাথে মেলে bin/। এটি গিটকে তার উপ-ডিরেক্টরিতে স্বয়ংক্রিয়ভাবে কোনও ফাইল সন্ধান করতে বাধা দেয়, তবে যদি বলুন যে একটি bin/fooউপ-ডিরেক্টরি তৈরি করা হয়, এই নিয়মের সামগ্রীর সাথে মেলে নাfoo

bin/**যে কোনও bin/ডিরেক্টরিতে এবং এর সমস্ত উপ-ডিরেক্টরিতে সমস্ত ফাইল এবং ডিরেক্টরি মেলে matches

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

সতর্কতা: আপনি উচিত না মত নিয়মাবলী ব্যবহার dir/*, /dir/**একা ইত্যাদি যদি না আপনার কাছে এমন কিছু বিষয় যা ডিরেক্টরিটি ভিতরে বিদ্যমান আন-উপেক্ষা । ফেরত তারকাচিহ্ন বা আপনি স্থায়ীভাবে তথ্য অনেক হারাতে পারেন নির্দিষ্ট এর আমন্ত্রণ থেকে git gc, git stashআরো এবং।

আমি আসলে কী করতে চাই তা জানি tmp/**/*না। আমি প্রথমে ভেবেছিলাম এটি tmp/সরাসরি উপস্থাপিত ফাইলগুলির সাব-ডিরেক্টরিতে ফাইলগুলি মেলানোর জন্য ব্যবহার করা যেতে পারে tmp/। তবে একটি সাধারণ পরীক্ষা বলে মনে হচ্ছে এটি এতে সমস্ত ফাইল উপেক্ষা করে tmp/


10
শুধু নির্মল, মধ্যে পার্থক্য কি bin/এবং bin/**?
চ্যান্সডি

4
আমি সন্দেহ করি যে bin/বিন ডিরেক্টরিটিকে অগ্রাহ্য করবে, যদিওbin/** অন্তর্ভুক্ত থাকবে তবে এর কোনও বিষয়বস্তু নেই
রবিন উইনস্লো

4
সিদ্ধার্থের উত্তরের সাথে এটি বেমানান বলে মনে হচ্ছে। উত্তর থেকে অঙ্কন, bin/ডিরেক্টরি নিজেই (সমস্ত উপ-ডিরেক্টরির এবং ফাইল সহ) উপেক্ষা করা হবে, যেহেতু bin/**bin ডিরেক্টরীতে সমস্ত ফাইল ও উপ-ডিরেক্টরির কিন্তু উপেক্ষা করা হবে না bin ডিরেক্টরীতে নিজেই। এটি সঠিক কিনা বা না, আমি অনিশ্চিত।
ক্রিস্টোফার বারম্যান 20

4
মনে রাখবেন, আপনি যদি বিন / ডিরেক্টরিতে সমস্ত ফাইল ট্র্যাক করতে চান তবে সমস্ত উপ-ডিরেক্টরিতে সমস্ত ফাইল উপেক্ষা করতে পারেন, আপনি (পরবর্তী লাইনে) bin/** \n !bin/*করতে পারেন (যেহেতু আমি মিনি-
মার্কাউন ডাউনলাইন

9
এই উত্তরটি অনেক উপায়ে ভুল। প্রথমত, গিট ডিরেক্টরিতে ট্র্যাক রাখে না, সুতরাং .gitignore এন্ট্রি কেবল কখনও ডিরেক্টরি বিষয়বস্তুগুলির সাথে মেলে, কখনও কোনও ডিরেক্টরি এর মতো নয়। দ্বিতীয়ত, নামের একটি ফাইল এবং ফোল্ডারের বিষয়বস্তু উভয়ইbin মিলে । তৃতীয়ত, এর উপ-ডিরেক্টরিতে কোনও ফাইলের সাথে মেলে না। তোমরা কি এগুলি পরীক্ষা করেছ? bin binbin/*
টমাসআর

46

binএবং bin/কেবলমাত্র পরেরটি কেবল একটি ডিরেক্টরিতে মিলবে তার মধ্যে পার্থক্য রয়েছে।

bin/**/*হিসাবে একই bin/**(, @ VonC এর উত্তর অনুযায়ী দৃশ্যত যেহেতু 1.8.2)।

মুশকিল, আমি কেবল এক ঘন্টা বা এতক্ষণে আমার চুল ছিঁড়ে ফেলেছি, তা bin/এবং isbin/** হয় না বেশ একই! যেহেতু পূর্ববর্তীটি সামগ্রিকভাবে ডিরেক্টরিটিকে উপেক্ষা করে এবং পরবর্তীকৃতগুলি এর মধ্যে থাকা প্রতিটি ফাইলকেই উপেক্ষা করে এবং প্রায় সব ক্ষেত্রেই গিট ডিরেক্টরিগুলি নিয়ে যত্ন করে না, সাধারণত কোনও পার্থক্য নেই। তবে, যদি আপনি !কোনও সাবপথটি উপেক্ষা করার চেষ্টা করেন তবে আপনি পিতামাতাকে যদি অগ্রাহ্য করেন তবে এই গিটটি (অহেম) এটিকে উপেক্ষা করবে! (আবার, ডিরেক্টরি সামগ্রীর চেয়ে বরং)

এটি উদাহরণস্বরূপ পরিষ্কার, সুতরাং একটি নতুন init-ed সংগ্রহস্থলের জন্য তাই সেট আপ:

$ cat .gitignore
ignored-file
or-dir
dir-only/
!dir-only/cant-reinclude
dir-contents/**
!dir-contents/can-reinclude

$ mkdir or-dir dir-only dir-contents

$ touch file ignored-file or-dir/ignored-file dir-only/cant-reinclude dir-contents/can-reinclude

নিম্নলিখিত ট্রেড করা ফাইলগুলি বিদ্যমান:

$ git ls-files --other
.gitignore
dir-contents/can-reinclude
dir-only/cant-reinclude
file
ignored-file
or-dir/ignored-file

তবে আপনি দেখতে পাচ্ছেন যে নিম্নলিখিত ফাইলগুলি উপেক্ষা করা হয়নি:

$ git ls-files --other --exclude-standard
.gitignore
dir-contents/can-reinclude
file

এবং যদি আপনি যুক্ত করার চেষ্টা করেন তবে আপনি পাবেন:

$ git add dir-only/cant-reinclude
The following paths are ignored by one of your .gitignore files:
dir-only/cant-reinclude
Use -f if you really want to add them.
fatal: no files added

আমি এই আচরণটিকে বাগ হিসাবে বিবেচনা করি। (এই সব চলছে git version 1.8.4.msysgit.0)


4
+1, সত্যই। আপনার এটিতে একটি আসল বাগ রিপোর্ট ফাইল করা বিবেচনা করা উচিত কারণ আচরণটি অপ্রত্যাশিত বলে মনে হয়।
চ্যান্সডি

4
ঠিক আমার ব্যবহারের ক্ষেত্রে। ধন্যবাদ!
সেবাস্তিয়ান গ্রাফ

4
এর বিভিন্নমুখী আচরণ dir/এবং dir/**করছেন। এর সাথে আন-উপেক্ষা !হ'ল কারণ "যদি সেই ফাইলটির কোনও পিতামহিত ডিরেক্টরি বাদ দেওয়া হয় তবে একটি ফাইল পুনরায় অন্তর্ভুক্ত করা সম্ভব নয়" [উত্স ]। বিভ্রান্তিকর, তবে কার্য সম্পাদনের কারণে সম্পন্ন হয়েছে। একটি সম্পর্কিত এসও প্রশ্ন দেখুন
tanius

23

মনে রাখবেন, কঠোরভাবে বলতে গেলে, গিট ডিরেক্টরিগুলি, কেবল ফাইলগুলি ট্র্যাক করে না। সুতরাং কোনও ডিরেক্টরি যুক্ত করা সম্ভব নয়, কেবল এটির বিষয়বস্তু

.gitignoreতবে প্রসঙ্গে , গিটটি একমাত্র কারণের জন্য ডিরেক্টরিগুলি বোঝার ভান করে

যদি সেই ফাইলটির কোনও পিতামাতাকে বাদ দেওয়া হয় তবে কোনও ফাইল পুনরায় অন্তর্ভুক্ত করা সম্ভব নয়।
https://git-scm.com/docs/gitignore#_pattern_format

বাদ দেওয়া নিদর্শনগুলির জন্য এর অর্থ কী? আসুন তাদের মাধ্যমে বিস্তারিতভাবে যান:

bin

এটি উপেক্ষা করে

  • ফাইল নামকরণ bin
  • ফোল্ডারের নামকরণ করা হয়েছে bin

binপরবর্তী !এন্ট্রি যুক্ত করে আপনি ফাইল এবং ফোল্ডারগুলিকে উপেক্ষা করে শ্বেত তালিকাতে রাখতে পারেন , তবে আপনি নামযুক্ত ফোল্ডারগুলির বিষয়বস্তু হোয়াইটলিস্ট করতে পারবেন নাbin

bin

!bin/file_in_bin # has no effect, since bin/ is blacklisted!
!bin/* # has no effect, since bin/ is blacklisted!
!file_in_bin # has no effect, since bin/ is blacklisted!

!bin # this works

bin/

উপরের মত একই, এটি নামের ফাইলগুলির সাথে মেলে না bin। একটি /ট্রেলিং যুক্ত করা গিটকে কেবল ডিরেক্টরিগুলির সাথে মেলে বলে।

bin/*

এটি উপেক্ষা করে

  • নামের একটি ফোল্ডারে থাকা ফাইলগুলিbin
  • নামযুক্ত ফোল্ডারগুলির সরাসরি সাবফোল্ডারগুলির সামগ্রী bin
bin/*  # blacklists bin/file_in_bin and bin/subfolder/

!bin/subfolder/file_in_sub # has no effect, since bin/subfolder is blacklisted!
!bin # whitelists files named bin/bin, since bin/ itself is not blacklisted
!bin/ # has no effect, since bin/ itself is not blacklisted


!bin/file_in_bin # works since bin/ itself is not blacklisted
!file_in_bin # works too
!bin/subfolder # works (so implicitly whitelists bin/subfolder/file_in_sub)
!bin/subfolder/ # works just as well
!bin/* # works for file_in_bin and subfolder/

bin/**

এটি উপেক্ষা করে

  • বিষয়বস্তু bin
  • এর মধ্যে সাবফোল্ডারগুলির সামগ্রী (বাসা বাঁধার কোনও স্তর) bin
bin/**  # blacklists bin/file_in_bin and
        # bin/subfolder/ and bin/subfolder/file_in_sub and
        # bin/subfolder/2/ and bin/subfolder/2/file_in_sub_2

!bin/subfolder/file_in_sub # has no effect, since bin/subfolder is blacklisted
!bin/subfolder/2/ # has no effect, since bin/subfolder is blacklisted
!bin/subfolder/2/file_in_sub_2 # has no effect, since bin/subfolder is blacklisted

!bin/subfolder # works only in combinations with other whitelist entries,
               # since all contents of subfolder are blacklisted (1)

!bin/file_in_bin # works since bin itself is not blacklisted
!bin/* # works for file_in_bin and subfolder; see (1)

9

আমি সবেমাত্র একটি নতুন রেপো তৈরি করেছি এবং কিছু জিনিস চেষ্টা করেছি। আমার ফলাফলগুলি এখানে:

নতুন ফলাফল

গিট সংস্করণ 2.10.1.windows.1

  1. প্রায় খালি রেপো চালু করুন। কেবল README ফাইল
  2. জনপূর্ণ করুন binগভীর ডিরেক্টরির বেশ কয়েক স্তর
    • bin.txt
    • Test.txt
    • bin/a/b/bin.txt
    • bin/a/b/Test.txt
    • bin/a/bin/bin.txt
    • bin/a/bin/Test.txt
    • bin/a/bin.txt
    • bin/a/Test.txt
    • bin/bin.txt
    • bin/Test.txt
  3. যোগ bingitignore করুন: ফলাফল
    • binডিরেক্টরি নীচে (এবং আরও গভীর) সমস্ত কিছু এখন উপেক্ষা করা হয়
    • রুট স্তর উপেক্ষা করা হয় না (/bin.txt এবং / টেস্ট.টেক্সট এখনও দেখায়)
  4. সম্পাদনা binকরার bin/gitignore মধ্যে: ফলাফল
    • পরিবর্তন নেই
  5. সম্পাদনা bin/করার জন্যbin/*
    • পরিবর্তন নেই
  6. সম্পাদনা bin/*করার জন্যbin/**
    • পরিবর্তন নেই
  7. সম্পাদনা bin/**করার জন্যbin/**/
    • bin/bin.txtএবং bin/Test.txtআর অগ্রাহ্য করা হয় না
  8. সম্পাদনা bin/**/করার জন্যbin/**/*
    • bin/bin.txtএবং bin/Test.txtউপেক্ষা করা ফিরে

পুরানো ফলাফল

গিট সংস্করণ: 2.7.0.windows.1

  1. প্রায় খালি রেপো চালু করুন। কেবল README ফাইল
  2. জনপূর্ণ করুন binগভীর ডিরেক্টরির বেশ কয়েক স্তর
    • bin/a/b/Test.txt
    • bin/a/bin/Test.txt
    • bin/a/Test.txt
    • bin/Test.txt
  3. যোগ bingitignore করুন: ফলাফল
    • binডিরেক্টরি নীচে (এবং আরও গভীর) সমস্ত কিছু এখন উপেক্ষা করা হয়
  4. সম্পাদনা binকরার bin/gitignore মধ্যে: ফলাফল
    • binডিরেক্টরিটির নীচে (এবং আরও গভীর) সমস্ত কিছু এখনও উপেক্ষা করা হয় (কোনও পরিবর্তন নেই)
  5. সম্পাদনা bin/করার জন্যbin/*
    • binডিরেক্টরিটির নীচে (এবং আরও গভীর) সমস্ত কিছু এখনও উপেক্ষা করা হয় (কোনও পরিবর্তন নেই)
  6. সম্পাদনা bin/*করার জন্যbin/**
    • binডিরেক্টরিটির নীচে (এবং আরও গভীর) সমস্ত কিছু এখনও উপেক্ষা করা হয় (কোনও পরিবর্তন নেই)
  7. সম্পাদনা bin/**করার জন্যbin/**/
    • bin/Test.txt আর উপেক্ষা করা হয় না
  8. সম্পাদনা bin/**/করার জন্যbin/**/*
    • binডিরেক্টরিটির নীচে থাকা সমস্ত কিছু (এবং আরও গভীর) আবার উপেক্ষা করা হবে

4
এটি একটি ভাল পরীক্ষা, আমি মনে করি যে বিন্যাস.টেক্সট এর নাম বিন্যাস.টেক্সট নামকরণ করলে কিছু মূল পার্থক্য দেখা যায়। আপনি যদি এটি করেন তবে আমি এই উত্তরের পক্ষে ভোট দেব।
ম্যাট জনসন

@ ম্যাটজহানসন ট্রু ... দুর্ভাগ্যক্রমে আমি এই মুহুর্তে আরও নতুন গিট সংস্করণে আছি
জো ফিলিপস

@ ম্যাটজহানসন অবশেষে আমি এর সন্ধান করলাম
জো ফিলিপস

8

নোট করুন যে ' **', যখন একটি উপ-ডিরেক্টরি ( **/bar) এর সাথে মিলিত হয়েছে , অবশ্যই এটির ডিফল্ট আচরণ থেকে পরিবর্তন হওয়া উচিত, যেহেতু git1.8.2 এর জন্য প্রকাশিত নোটটি এখন উল্লেখ করেছে:

নিদর্শন .gitignoreএবং .gitattributesফাইল থাকতে পারে **/একটি প্যাটার্ন যে সাব 0 বা তার বেশি মাত্রার সাথে মেলে হিসাবে।

উদাহরণস্বরূপ " foo/**/bar" "নিজে bar" foo"বা " "এর একটি উপ-ডিরেক্টরিতে " " " "মিলছে foo


মনে রাখার নিয়মটি (এবং যা এই সিনট্যাক্সের পিছনে অভিপ্রায়টির পার্থক্য বুঝতে সহায়তা করে):

যদি সেই ফাইলটির কোনও পিতামহিত ডিরেক্টরি বাদ দেওয়া হয় তবে কোনও ফাইল পুনরায় অন্তর্ভুক্ত করা সম্ভব নয়।


সাধারণত, যদি আপনি একটি উপেক্ষা করা ফোল্ডার চ এর সাবফোল্ডার থেকে ফাইলগুলি বাদ দিতে চান তবে আপনি এটি করবেন:

f/**
!f/**/
!f/a/sub/folder/someFile.txt

এটাই:

  • যদি প্রথম নিয়মটি ছিল f/, ফোল্ডারটিf/ উপেক্ষা করা হবে এবং নীচের নিয়মগুলি fকোনও বিষয় নয়।
  • f/**হিসাবে একই অর্জন f/, কিন্তু সমস্ত উপ-উপাদান উপেক্ষা (ফাইল এবং সাবফোল্ডার) ।
    যে আপনি সুযোগ (gitignore থেকে বাদ) শ্বেত তালিকায় সাবফোল্ডার দেয়: !f/**/
  • যেহেতু সব fসাবফোল্ডার হয় না উপেক্ষা, আপনি একটি ফাইল বাদ দেওয়ার একটি নিয়ম জুড়তে পারেন ( !f/a/sub/folder/someFile.txt)

কিভাবে এই প্রশ্নের উত্তর দেয়?
টমাসআর

0

এর মধ্যে bin/*আর একটি পার্থক্য রয়েছে bin/

bin/ম্যাচগুলি foo/bin/test.txt(প্রত্যাশার মতো), তবে bin/*তা নয়, যা অদ্ভুত বলে মনে হয় তবে এটি নথিভুক্ত: https://git-scm.com/docs/gitignore

"ডকুমেন্টেশন / *। এইচটিএমএল" "ডকুমেন্টেশন / গিট এইচটিএমএল" এর সাথে মেলে তবে "ডকুমেন্টেশন / পিপিসি / পিপিসি এইচটিএমএল" বা "সরঞ্জাম / পারফ / ডকুমেন্টেশন / পারফেক্ট html" নয়।

এর কারণটি এই নিয়মগুলি হিসাবে উপস্থিত বলে মনে হচ্ছে:

  • যদি প্যাটার্নটি স্ল্যাশের সাথে শেষ হয় তবে এটি নীচের বর্ণনার উদ্দেশ্যে সরানো হবে ...

  • যদি প্যাটার্নটিতে স্ল্যাশ / থাকে না, গিট এটিকে শেল গ্লোব প্যাটার্ন হিসাবে বিবেচনা করে এবং .gitignore ফাইলের অবস্থানের সাথে সম্পর্কিত পথের নামের সাথে ম্যাচের জন্য পরীক্ষা করে ...

  • অন্যথায়, গিট এফএনএম_PATHNAME পতাকা সহ fnmatch (3) দ্বারা ব্যবহারের জন্য উপযুক্ত শেল গ্লোব হিসাবে প্যাটার্নটিকে বিবেচনা করে ...

সুতরাং যদি প্যাটার্নটি স্ল্যাশের সাথে শেষ হয় তবে স্ল্যাশটি সরানো হবে এবং এটি শেল গ্লোব প্যাটার্ন হিসাবে বিবেচিত হবে, এক্ষেত্রে এটি binমেলে foo/bin/test.txt। যদি এটি দিয়ে শেষ হয়/* , স্ল্যাশ সরানো হয়নি এবং এটি এফএনমেচ-এ চলে গেছে, যা সাব-ডিরেক্টরিতে মেলে না।

যাইহোক, একই জন্য সত্য নয় foo/bin/এবং foo/bin/*কারণ থেকে পিছিয়ে থাকা স্ল্যাশ সরানোর পরও foo/bin/, এটা এখনও স্ল্যাশ রয়েছে তাই এটি একটি fnmatch প্যাটার্ন, না একটি উল্লিখিত glob হিসাবে গণ্য হচ্ছে। অর্থাৎ এটি মিলবে নাbar/foo/bin/test.txt

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