বাইনারি ফাইল ছাড়া gitignore


141

ফাইল gitব্যবহারে বাইনারি ফাইলগুলি কীভাবে উপেক্ষা করা যায় .gitignore?

উদাহরণ:

$ g++ hello.c -o hello

"হ্যালো" ফাইলটি একটি বাইনারি ফাইল। gitএই ফাইল উপেক্ষা করতে পারেন?



2
আমি খুব অবাক হয়েছি এমন একটি পুরানো এবং গুরুত্বপূর্ণ প্রশ্নের সঠিক উত্তর নেই। আমি আরও বিস্মিত হয়েছি যে উত্তরটি সরাসরি এগিয়ে [^\.]*
TamaMcGlinn

এটি কার্যকর হয় না
টিমোথেকোর

উত্তর:


136
# Ignore all
*

# Unignore all with extensions
!*.*

# Unignore all dirs
!*/

### Above combination will ignore all files without extension ###

# Ignore files with extension `.class` & `.sm`
*.class
*.sm

# Ignore `bin` dir
bin/
# or
*/bin/*

# Unignore all `.jar` in `bin` dir
!*/bin/*.jar

# Ignore all `library.jar` in `bin` dir
*/bin/library.jar

# Ignore a file with extension
relative/path/to/dir/filename.extension

# Ignore a file without extension
relative/path/to/dir/anotherfile

1
এই সমাধান একটি কবজ মত কাজ করে! আমি বুঝতে পারছি না কেন সমস্ত ডায়ারগুলিকে আনগনোর করে "! * /", এটি কোনও এক্সটেনশান সহ সাবডির ফাইলগুলিকেও অচিহ্নিত করতে পারে? (উদাঃ এএএ / বিবিবিসি) তবে তবুও এক্সটেনশন ছাড়াই সাবডির ফাইলটিকে উপেক্ষা করুন। (উদাঃ
এএএ

4
দেখে মনে হচ্ছে যে এই ডিরেক্টরিটি প্রত্যাশার মতো কাজ করে না যখন আমি দেখতে পেলাম যে যখন ডিরেক্টরিতে একাধিক স্তর থাকে ...
ড্রাগনএক্স্লাবাং

@ DRgonxlwang আমি কৌতূহল করছি কোথায় এটি কাজ করবে না? এখানে গৃহীত সমাধান স্ট্যাকওভারফ্লো.com/a/19023985/1426932 কিছুটা আলাদা এবং এর !/**/পরিবর্তে ব্যবহার করে !*/; কোনটি সঠিক? / সিসি @ ভনসি
টিমোথেকোর

ইউনিক্স সংস্কৃতিতে শেল স্ক্রিপ্টগুলির নামকরণ এবং বাইনারি এক্সিকিউটেবলকে এক্সটেনশন ছাড়াই নামকরণ করা মোটামুটি সাধারণ, সেক্ষেত্রে এই সমাধানটির ফলে স্ক্রিপ্টগুলি উপেক্ষা করা হবে। আরও ভাল ধারণা হ'ল বাইনারি এক্সিকিউটেবলগুলিকে ম্যানুয়ালি .gitignore এ যুক্ত করা যখনই তারা প্রকল্পে যুক্ত হয় - সাধারণত এটি প্রায়শই ঘটে না। যদি এটি খুব জটিল হয় তবে বেদেন্টকের পরামর্শ দেওয়া মেকফিল সমাধানটি আরও ভাল।
পিটার হেলফার


42

এর মতো কিছু যুক্ত করুন

*.o

.gitignore ফাইলটিতে এটিকে আপনার রেপোর গোড়ায় স্থাপন করুন (অথবা আপনি যে কোনও সাব ডিরেক্টরিতে চান সেটি স্থাপন করতে পারেন - এটি সেই স্তরটি থেকে প্রয়োগ করা হবে) এবং এটি পরীক্ষা করে দেখুন।

সম্পাদনা:

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

আপনি চেষ্টা করতে পারেন

*
!*.*

তবে তা বুদ্ধিমানের নয়।


1
সম্পাদনা যুক্ত করা হয়েছে। আপনার বাইনারিটির এক্সটেনশন হওয়ার কোনও কারণ নেই
manojlds

10
এক্সিকিউটেবলের প্রায়শই এক্সটেনশন থাকে না। gccপাস করার মাধ্যমে তৈরি করা ফাইলগুলির জন্য আমি এখানে একই জিনিস করার চেষ্টা করছি -o $@
নাথান লিলিয়েনথাল

29

আপনার কাছে সমস্ত এক্সিকিউটেবলকে যুক্ত করতে .gitignore(যা আপনি সম্ভবত "বাইনারি ফাইল" বলতে চান যা আপনার প্রশ্ন থেকে বিচার করে) আপনি ব্যবহার করতে পারেন

find . -executable -type f >>.gitignore

আপনি যদি নিজের লাইনের ক্রমটি যত্ন নেওয়ার বিষয়ে চিন্তা না করেন তবে আপনি নিম্নলিখিত কমান্ডটি দিয়ে .gitignoreআপডেট করতে পারেন .gitignoreযা ডুপ্লিকেটগুলি সরিয়ে দেয় এবং বর্ণানুক্রমিক ক্রম অক্ষত রাখে।

T=$(mktemp); (cat .gitignore; find . -executable -type f | sed -e 's%^\./%%') | sort | uniq >$T; mv $T .gitignore

দ্রষ্টব্য, আপনি সরাসরি আউটপুটটি পাইপ করতে পারবেন না .gitignoreকারণ catএটি পড়ার জন্য ফাইলটি খোলার আগে এটি কেটে যাবে । এছাড়াও, আপনি \! -regex '.*/.*/.*'উপ-ডিরেক্টরিগুলিতে এক্সিকিউটেবল ফাইলগুলি অন্তর্ভুক্ত করতে চান না কিনা তা সন্ধান করতে আপনি একটি বিকল্প হিসাবে যুক্ত করতে চাইতে পারেন ।


23

বাইনারিগুলির সাথে আপনার সেরা বাজি হয় হয় তাদের একটি এক্সটেনশন দেওয়া যা আপনি খুব সহজেই একটি স্ট্যান্ডার্ড প্যাটার্ন দিয়ে ফিল্টার করতে পারেন, বা ডিরেক্টরিতে যে ডিরেক্টরি ডিরেক্টরিতে ফিল্টার করতে পারেন সেগুলিতে রেখে দিন।

উইন্ডোজটিতে এক্সটেনশন পরামর্শটি বেশি প্রযোজ্য, কারণ এক্সটেনশনগুলি স্ট্যান্ডার্ড এবং মূলত প্রয়োজনীয় তবে ইউনিক্সে আপনি আপনার এক্সিকিউটেবল বাইনারিগুলিতে এক্সটেনশনগুলি ব্যবহার করতে বা নাও করতে পারেন। এই ক্ষেত্রে, আপনি এগুলি একটি বিন / ফোল্ডারে রাখতে পারেন bin/এবং আপনার .gitignore এ যুক্ত করতে পারেন।

আপনার খুব নির্দিষ্ট, ক্ষুদ্র-স্কোপ উদাহরণে আপনি কেবল helloআপনার .gitignore এ রাখতে পারেন।


15

আপনি চেষ্টা করতে পারেন আপনার .gitignore:

*
!*.c

এই পদ্ধতির অনেক অসুবিধা রয়েছে, তবে এটি ছোট প্রকল্পগুলির জন্য গ্রহণযোগ্য।


3
আপনি যদি কমপক্ষে প্রধান অসুবিধাগুলি
তালিকাবদ্ধ

সুস্পষ্ট অসুবিধা হ'ল অনুমতি অস্বীকারের আদেশ, সঠিক উপায় হ'ল অনাকাঙ্ক্ষিত ফাইলগুলিকে অগ্রাহ্য করা, সমস্তকে অস্বীকার না করা এবং তারপরে কেবল কাম্য ফাইলগুলি অন্তর্ভুক্ত করা।
আন্দ্রে বেলিয়ানকৌ

13

আপনি যদি কোনও মেকফিল ব্যবহার করছেন, আপনি নিজের .gitignore ফাইলটিতে নতুন বাইনারিগুলির নাম যুক্ত করতে আপনার তৈরি বিধিগুলি সংশোধন করার চেষ্টা করতে পারেন।

একটি ছোট হাস্কেল প্রকল্পের জন্য মেকফিলের উদাহরণ এখানে রয়েছে;

all: $(patsubst %.hs, %, $(wildcard *.hs))

%: %.hs
    ghc $^
    grep -xq "$@" .gitignore || echo $@ >> .gitignore

এই মেকফাইলটি হাস্কেল কোডের বাইরে এক্সিকিউটেবলগুলি তৈরি করার জন্য একটি নিয়মকে সংজ্ঞায়িত করে। Gc কে আহ্বান করার পরে, বাইনারি ইতিমধ্যে এটিতে রয়েছে কিনা তা দেখতে আমরা .gitignore পরীক্ষা করে দেখি। যদি তা না হয় তবে আমরা বাইনারিটির নামটি ফাইলটিতে যুক্ত করি।


এখন, এটি এক ভিন্ন পদ্ধতি।
রেনেনিফেনিগার

12

বাইনারি ফাইলগুলি প্রায়শই কোনও এক্সটেনশন ছাড়াই থাকে। এটি যদি আপনার ক্ষেত্রে হয় তবে এটি ব্যবহার করে দেখুন:

*
!/**/
!*.*

আরএফ: https://stackoverflow.com/a/19023985/1060487


5

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

import subprocess, os

git_root = subprocess.check_output(['git', 'root']).decode("UTF-8").strip()
exes = []
cut = len(git_root)

for root, dirnames, filenames in os.walk(git_root+"/src/"):
  for fname in filenames:
    f = os.path.join(root,fname)
    if not os.access(f,os.X_OK):
      continue

    ft = subprocess.check_output(['file', f]).decode("UTF-8")

    if 'ELF' in ft and 'executable' in ft:
      exes.append(f[cut:])

gifiles = [ str.strip(a) for a in open(git_root + "/.gitignore").readlines() ]
gitignore=frozenset(exes+gifiles)

with open(git_root+"/.gitignore", "w") as g:
  for a in sorted(gitignore):
    print(a, file=g)

আমি একটি অনুরূপ স্ক্রিপ্ট তৈরি করেছি এবং একটি সদৃশ প্রশ্নে পোস্ট করেছি: stackoverflow.com/a/28258619/218294 আপনার কোডটি সুন্দর :)
স্যাম ওয়াটকিন্স

4

কেবলমাত্র একটি মূলের মধ্যেই নয়, কিছু সাবডিরেও উপেক্ষা করার উপায়:

# Ignore everything in a root
/*
# But not files with extension located in a root
!/*.*
# And not my subdir (by name)
!/subdir/
# Ignore everything inside my subdir on any level below
/subdir/**/*
# A bit of magic, removing last slash or changing combination with previous line
# fails everything. Though very possibly it just says not to ignore sub-sub-dirs.
!/subdir/**/
# ...Also excluding (grand-)children files having extension on any level
# below subdir
!/subdir/**/*.*

অথবা, আপনি যদি কিছু নির্দিষ্ট ধরণের ফাইল অন্তর্ভুক্ত করতে চান:

/*
!/*.c
!/*.h
!/subdir/
/subdir/**/*
!/subdir/**/
!/subdir/**/*.c
!/subdir/**/*.h

মনে হয় এটি প্রতিটি নতুন উপ-ডিরেক্টরিতেও চাইলে আপনার মতো কাজ করতে পারে !:

/*
!/*.c
!/*.h
!/*/
/*/**/*
!/*/**/
!/*/**/*.c
!/*/**/*.h

লিডিং স্ল্যাশগুলি কেবল প্রথম দুটি লাইনে গুরুত্বপূর্ণ এবং অন্যটিতে .চ্ছিক। টালিং স্ল্যাশ এর মধ্যে !/*/এবং !/subdir/এটি alচ্ছিক , তবে কেবল এই লাইনে।


3

আপনি যদি আপনার .gitignore ফাইল এবং এই ফাইলগুলিতে এই আদেশগুলি অনুসরণ করেন তবে মনে হয় আপনি চেষ্টা করতে চাইতে পারেন:

git rm --cached FILENAME

এরপরে, আপনার .gitignore যুক্ত করুন, প্রতিশ্রুতিবদ্ধ এবং পুশ করুন। এটি বুঝতে 40 মিনিট সময় নিয়েছেন, আশা করি এটি আমার মতো নবাগতদের সহায়তা করবে


2

পুরানো থ্রেড, তবে এখনও প্রাসঙ্গিক। আমি মেকফিলটি পরিবর্তন করেছি সুতরাং লিঙ্ক করার পরে ফলাফলযুক্ত বাইনারি ফাইলটির নাম [ফিলিভনাম] রয়েছে। বিন শুধুমাত্র পরিবর্তে [filname]। তারপরে আমি গিটিগনোরে * .bin ফাইল যুক্ত করেছি।
এই রুটিনটি আমার চাহিদা পূরণ করে।


1

আমি অন্য কোনও সমাধান জানি না তবে একে একে একে যুক্ত করে .gitignore

পরীক্ষার একটি অপরিশোধিত উপায় হ'ল ফাইল কমান্ডের আউটপুট গ্রেপ করা:

find . \( ! -regex '.*/\..*' \) -type f | xargs -n 1 file | egrep "ASCII|text"

সম্পাদনা

আপনি কেবল মৃত্যুদন্ড কার্যকর করার নাম রাখেন না কেন hello.bin?


কারণ ফাইল এক্সটেনশনের সাথে এক্সিকিউটেবলের নামকরণ .binকরা খারাপ অভ্যাস।
এমডি এক্সএফ


0

আমি GOPATH ডিরেক্টরিতে দুটি এন্ট্রি সহ একটি .gitignore ফাইল তৈরি করেছি।

/bin
/pkg

এটি বর্তমানে সমস্ত সংকলিত বিকাশ উপেক্ষা করে।


0

.gitignore কমপক্ষে লিনাক্সে ফাইলগুলি ফিল্টার করতে গ্লোব প্রোগ্রামিং ব্যবহার করে।

আমি একটি মিটআপে কোডিং টক দিতে চলেছি এবং প্রস্তুতির জন্য, আমি বেশ কয়েকটি সাব-ডাইরেক্টরি দিয়ে একটি ডিরেক্টরি তৈরি করেছি যা আমি তাদের উপস্থাপন করতে চাইছি সেই আদেশ অনুসারে নামকরণ করা হয়েছে: 01_সুবজেক্ট 1, 02_সুবজেক্ট 2, 03_সুবজেক্ট 3। প্রতিটি উপ-ডিরেক্টরিতে একটি ভাষা-নির্ভর এক্সটেনশন সহ একটি উত্স ফাইল থাকে যা একটি এক্সিকিউটেবল ফাইলের সাথে সংকলন করে যার নাম সাধারণ অনুশীলন অনুযায়ী এক্সটেনশন ছাড়াই উত্স ফাইলের নামের সাথে মেলে।

সংক্ষিপ্ত ফাইলগুলি আমি নিম্নলিখিত .gitignore লাইনের সাথে সংখ্যা-উপসর্গযুক্ত ডিরেক্টরিতে বাদ দিই:

[0-9][0-9]_*/[!\.]*

ডকুমেন্টেশন সম্পর্কে আমার বোঝার অনুযায়ী এটি কাজ করা উচিত নয়। পিছনের নক্ষত্রটি ব্যর্থ হওয়া উচিত কারণ এটি 'সহ' সংখ্যক অনির্দিষ্ট অক্ষরের সাথে মেলে। + এক্সটেনশন। পিছনে অবস্থিত অ্যাসিডের্ককে ছাড়তে ব্যর্থ হওয়া উচিত (এবং হয়) কারণ [!\.]কেবলমাত্র একটি একক অ-পিরিয়ড চরিত্রের সাথে মেলে। যাইহোক, আমি নিয়মিত প্রকাশের জন্য যেমনটি করেছি, ততক্ষণে আমি যুক্ত করেছি, এবং এটি কার্যকর হয়। কাজের দ্বারা, আমি বলতে চাই যে গিট নোটিশগুলি উত্স ফাইলে পরিবর্তিত হয়, তবে সংঘবদ্ধ ফাইলগুলিতে অস্তিত্ব বা পরিবর্তন হয় না।



0

আপনার .gitignore ফাইলটিতে নিম্নলিখিতগুলি যুক্ত করুন:

[^\.]*

ব্যাখ্যা:

[] encloses a character class, e.g. [a-zA-Z] means "any letter".
^  means "not"
\. means a literal dot - without the backslash . means "any character"
*  means "any number of these characters"

0

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

সত্য যে .gitignoreফাইলের নাম উপর কাজ করে একটা গুরুত্বপূর্ণ বৈশিষ্ট্য কর্মক্ষমতা প্রজ্ঞাময়: গীত শুধুমাত্র তালিকা ফাইল প্রয়োজন, কিন্তু খুলুন এবং জানেন যা ফাইল উপেক্ষা করা তাদের পড়া না। অন্য কথায়, গিটটি যদি তাদের সামগ্রীর উপর ভিত্তি করে ফাইলগুলি উপেক্ষা করতে বলতে পারে তবে মারাত্মক ধীর হয়ে যাবে।

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