.Gitignore এ নেই এমন ফাইলগুলি সন্ধান করুন


12

আমার প্রকল্পে ফাইলগুলি প্রদর্শন করার জন্য আমার কাছে কমান্ডটি পাওয়া গেছে:

find . -type f -not -path './node_modules*' -a -not -path '*.git*' \
       -a -not -path './coverage*' -a -not -path './bower_components*' \
       -a -not -name '*~'

.Gitignore এ থাকা ফাইলগুলি না দেখাতে আমি কীভাবে ফাইলগুলি ফিল্টার করব?

আমি ভেবেছিলাম যে আমি ব্যবহার করি:

while read file; do
    grep $file .gitignore > /dev/null && echo $file;
done

তবে .gitignore ফাইলটিতে গ্লোব প্যাটার্ন থাকতে পারে (ফাইলটি .gitignore থাকলে এটি পাথের সাথে কাজ করবে না), গ্লোবস থাকতে পারে এমন নিদর্শনগুলির ভিত্তিতে আমি কীভাবে ফাইলগুলি ফিল্টার করতে পারি?

উত্তর:


11

gitউপলব্ধ git-check-ignoreপরীক্ষা করার জন্য একটি ফাইল অন্তর্ভুক্ত করা হয়নি কিনা .gitignore

সুতরাং আপনি ব্যবহার করতে পারেন:

find . -type f -not -path './node_modules*' \
       -a -not -path '*.git*'               \
       -a -not -path './coverage*'          \
       -a -not -path './bower_components*'  \
       -a -not -name '*~'                   \
       -exec sh -c '
         for f do
           git check-ignore -q "$f" ||
           printf '%s\n' "$f"
         done
       ' find-sh {} +

নোট করুন যে আপনি এটির জন্য বড় মূল্য দিতে হবে কারণ প্রতিটি ফাইলের জন্য চেক করা হয়েছিল।


কি find-sh {} +শেষে?
jcubic

@ জ্যাকুবিক দেখুন unix.stackexchange.com/q/12902/38906
কিউংএলএম

ঠিক আছে, এবং কি find-sh?
jcubic

@ জাকিউবিক এটিই নাম যা আপনি ইনলাইন-শ স্ক্রিপ্টের জন্য দিয়েছিলেন, সুতরাং ত্রুটি দেখা
দিলে আপনার

@ জেকিউবিক find /tmp -exec sh -c ': "${non_existed_var:?foo}"' find-sh {} +উদাহরণস্বরূপ চেষ্টা করুন
কুওগল্ম

9

এটি করার জন্য একটি গিট কমান্ড রয়েছে: উদাঃ

my_git_repo % git grep --line-number TODO                                                                                         
desktop/includes/controllers/user_applications.sh:126:  # TODO try running this without sudo
desktop/includes/controllers/web_tools.sh:52:   TODO: detail the actual steps here:
desktop/includes/controllers/web_tools.sh:57:   TODO: check if, at this point, the menurc file exists. i.e. it  was created

যেমন আপনি বলেছেন, এটি একটি বেসিক গ্রেপ করবে সাধারণ গ্রেপ বিকল্পগুলির বেশিরভাগ ক্ষেত্রে, তবে এটি .gitআপনার .gitignoreফাইলের কোনও ফাইল বা ফোল্ডার অনুসন্ধান করবে না ।
আরও তথ্যের জন্য, দেখুনman git-grep

Submodules:

যদি এই গিট রেপোর ভিতরে আপনার অন্যান্য গিট রেপো থাকে, (সেগুলি সাবমোডিয়ুলের মধ্যে থাকা উচিত) তবে আপনি --recurse-submodulesসাবমডিউলে অনুসন্ধান করতে পতাকাটিও ব্যবহার করতে পারেন


দুর্দান্ত, এটি প্রায়শই কাজ করে কারণ বর্তমান ডিরেক্টরিতে আমার কাছে অন্যান্য গিট রেপো রয়েছে, এ কারণেই আমার কাছে "* .git" রয়েছে।
jcubic

8

আপনার চেকআউটে থাকা এবং গিট দ্বারা ট্র্যাক করা ফাইলগুলি প্রদর্শন করতে, ব্যবহার করুন

$ git ls-files

এই কমান্ডটিতে প্রদর্শনের জন্য অনেকগুলি বিকল্প রয়েছে, যেমন ক্যাশেড ফাইল, অচিহ্নযুক্ত ফাইল, পরিবর্তিত ফাইল, উপেক্ষা করা ফাইল ইত্যাদি See দেখুন git ls-files --help


আমি এটি সম্পর্কেও ভাবি git ls-filesকিন্তু ভাবি না যে এটিতে আনর্যাকড ফাইলগুলি দেখানোর বিকল্প রয়েছে, কোনটি?
কিউংলম

1
@ কোংলম -o(অন্যান্য) যেমন,git ls-files -o -X .gitignore
কুসালানন্দ

আহ হ্যাঁ, কিন্তু কেস যেখানে ফাইল আগে হবেঃ ড হ্যান্ডেল করতে পারে না কিন্তু অন্তর্ভুক্ত .gitignore
cuonglm

মাইনর নোট: এটি সিস্টেম থেকে আসল ফাইলগুলি তালিকাভুক্ত করে না তবে গিট ইতিহাসের অন্তর্ভুক্ত ফাইলগুলি। কেস-সংবেদনশীল সিস্টেমগুলিতে এটি সূক্ষ্ম পার্থক্য হতে পারে (যেমন উইন্ডোজ শেয়ার)। বলুন, আমি প্রতিশ্রুতিবদ্ধ ./foo.txt তবে এরপরে এটি পুনরায় নামকরণ করুন। কিছু Git ক্লায়েন্ট এই পরিবর্তন এবং চিনতে পারবে না git ls-filesআউটপুট ./foo.txt যখন findহায় আউটপুট ./Foo.txt
Griddo

2

আপনি এমন একটি অ্যারে ব্যবহার করতে পারেন যাতে ব্যাশ গ্লোব সঞ্চালিত হবে।

এর মতো ফাইল থাকা:

touch file1 file2 file3 some more file here

এবং ignoreএই মত একটি ফাইল হচ্ছে

cat <<EOF >ignore
file*
here
EOF

ব্যবহার

arr=($(cat ignore));declare -p arr

এর ফলাফল হবে:

declare -a arr='([0]="file" [1]="file1" [2]="file2" [3]="file3" [4]="here")'

এরপরে আপনি সেই ডেটাগুলি কাজে লাগাতে যে কোনও কৌশল ব্যবহার করতে পারেন।

আমি ব্যক্তিগতভাবে এই জাতীয় কিছু পছন্দ করি:

awk 'NR==FNR{a[$1];next}(!($1 in a))'  <(printf '%s\n' "${arr[@]}") <(find . -type f -printf %f\\n)
#Output
some
more
ignore

gitignoreএর সুপারসেট হয় bashউল্লিখিত glob তোমার মতোই কিছু মিস করবেন না!file*
cuonglm

@cuonglm আপনি কী বলতে চাচ্ছেন !file*? ফাইলকে উপেক্ষা করার ক্ষেত্রে একটি গ্লোব প্যাটার্ন হিসাবে বা ফাইলের নাম হিসাবে?
জর্জ ভ্যাসিলিউ

gitignoreফাইল প্যাটার্নটি গ্রহণ করুন যেমন !file*ফাইলগুলি শুরু করে fileএবং ডাবল **
স্টারকে

.gitignoreগুচ্ছ বৈশিষ্ট্য রয়েছে যার সবগুলিই সরাসরি ব্যাশে প্রয়োগ করা এত সহজ না হতে পারে: git-scm.com/docs/gitignore । যদিও সাধারণ সরল
গ্লোবগুলিকে অবহেলা করা

আপনি কি অনুবাদ !করেছেন? সম্ভবত বর্ধিত গ্লোবিং এই পরিস্থিতিটি পরিচালনা করতে পারে। ডাবলস্টার সম্পর্কে, ব্যাশ এটির সাহায্যে পরিচালনা করতে পারে shopt -s globstar
জর্জ ভ্যাসিলিউ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.