আমি কীভাবে কোনও ফাইল বা ডিরেক্টরিতে গিট শাখাগুলি অনুসন্ধান করতে পারি?


323

গিটে, আমি কীভাবে একটি শাখা সংখ্যক পথ জুড়ে কোনও ফাইল বা ডিরেক্টরি অনুসন্ধান করতে পারি?

আমি একটি শাখায় কিছু লিখেছি, কিন্তু কোনটি মনে নেই। এখন এটি আমার সন্ধান করা উচিত।

স্পেসিফিকেশন : আমি এমন একটি ফাইল সন্ধান করছি যা আমি আমার একটি শাখায় তৈরি করেছি। আমি এটিকে পথ দ্বারা খুঁজে পেতে চাই, এবং এর বিষয়বস্তু দ্বারা নয়, কারণ বিষয়বস্তু কী তা আমার মনে নেই।


আমি প্রশ্ন সম্পর্কে অস্পষ্ট। এই ফাইলটি কি এখন কোনও শাখায় মুছে ফেলা হয়েছে? ফাইলটি মুছে ফেলা হয়েছিল?
আবাইজার্ন

উত্তর:


444

git log+ + git branchএটা আপনার জন্য পাবেন:

% git log --all -- somefile

commit 55d2069a092e07c56a6b4d321509ba7620664c63
Author: Dustin Sallings <dustin@spy.net>
Date:   Tue Dec 16 14:16:22 2008 -0800

    added somefile


% git branch -a --contains 55d2069
  otherbranch

গ্লোববিং সমর্থন করে:

% git log --all -- '**/my_file.png'

একক উদ্ধৃতি প্রয়োজনীয় (কমপক্ষে বাশ শেল ব্যবহার করা থাকলে) তাই শেলটি প্রসারিত না করে (ইউনিক্সের মতোই find) পরিবর্তনের পরিবর্তে গ্লোব প্যাটার্নটি পাস করে ।


2
এটির সঠিক পথটি যদি আপনি জানেন তবে এটি কাজ করে somefile: উদাহরণস্বরূপ, যদি আপনাকে পথ / ফাইলের নাম ধরে রেজিেক্স অনুসন্ধানের প্রয়োজন হয় তবে আপনি ইডিডাকের উত্তরটি ব্যবহার করতে পারেন।
শ্রীভাতসার আর

70
গ্লোব্বিংকেও সমর্থন করে:git log --all -- **/my_file.png
ওয়েবম্যাট

3
আমি এটি কিছুটা ভিন্ন সমস্যার জন্য ব্যবহার করেছি। আমি একটি নির্দিষ্ট শাখায় প্রতিশ্রুতিবদ্ধ সমস্ত *। এসকিউএল ফাইলগুলি সন্ধান করার চেষ্টা করছিলাম। সুতরাং আমি ব্যবহার git log --grep='branch' --author='me' -- *.sql। কবজির মতো কাজ করেছেন। গিট সংস্করণ 1.7.11.1
thepriebe

1
নোট যা gitkগ্লোববিংকেও সমর্থন করে। এটি একটি দুর্দান্ত উত্তর @ ওয়েবেট! আপনি যদি এটি কোথায় মুছে ফেলা / তৈরি করা / ইত্যাদি দেখতে চান তবে আপনি এটি ব্যবহার করতে পারেন git log --all --stat -- **/my_file.png, আপনি যদি কোনও মুছে ফেলা প্রতিশ্রুতি থেকে এটি পরীক্ষা করে দেখেন তবে আপনাকে আন্দাজ করতে হবে না।
eacousineau

1
@ ওয়েবেট: উত্তরে গ্লোবিংয়ের বিষয়ে আপনার তথ্য যুক্ত করার স্বাধীনতা আমি নিয়েছিলাম। এটি উল্লেখ করার জন্য ধন্যবাদ!
sleske

65

গিট এলএস-ট্রি সাহায্য করতে পারে। বিদ্যমান সমস্ত শাখা জুড়ে অনুসন্ধান করতে:

for branch in `git for-each-ref --format="%(refname)" refs/heads`; do
  echo $branch :; git ls-tree -r --name-only $branch | grep '<foo>'
done

এর সুবিধা হ'ল আপনি ফাইলের নামের জন্য নিয়মিত এক্সপ্রেশন দিয়েও অনুসন্ধান করতে পারেন।


3
কয়েকটি আশাবাদী সহায়ক মন্তব্য: (ক) আপনি সম্ভবত "-r" কে "গিট এলএস-ট্রি" এ যুক্ত করতে চান যাতে এটি কোনও উপ ডিরেক্টরিতে থাকলেও এটি ফাইলটি খুঁজে পেতে পারে। (খ) প্রথম লাইনের একটি সম্ভবত আরও নিখুঁত বিকল্পটি git for-each-ref --format="%(refname)" refs/headsহ'ল "প্রত্যেকটি রেফের জন্য গিট " ব্যবহার করা, উদাহরণস্বরূপ "শাখার জন্য ; কর" (গ) "গিট এলএস-ট্রি - নাম-কেবল" আউটপুটটি সুশৃঙ্খল করে তুলবে (d) আপনার উত্তরে এটি উল্লেখ করার মতো হতে পারে যে ডাস্টিনের সমাধানের সাথে এর একটি সুবিধা রয়েছে, যথা আপনার ফাইল
নামটি

9
আমি এটিকে একটি স্ক্রিপ্টে জড়িয়েছি যাতে আপনি "gitfind.sh <regex>" চালাতে পারেন; সারকথা হল gist.github.com/62d981890eccb48a99dc
Handyman5

3
মনে রাখবেন যে এটি কেবল স্থানীয় শাখা জুড়ে অনুসন্ধান করবে । রিমোট-ট্র্যাকিং শাখাগুলি অনুসন্ধান করতে এর refs/remotesপরিবর্তে ব্যবহার করুন refs/heads। সমস্ত কিছু অনুসন্ধানের জন্য (স্থানীয় শাখা, দূরবর্তী ট্র্যাকিং শাখা এবং ট্যাগগুলি) কেবল ব্যবহার করুন refs/
স্লেসকে

19

যদিও ididak প্রতিক্রিয়া বেশ কুল, এবং Handyman5 এটি ব্যবহার করতে একটি স্ক্রিপ্ট প্রদান করে, আমি এটা একটু যে পদ্ধতির ব্যবহার মানা পাওয়া যায় নি।

কখনও কখনও আপনাকে এমন কিছু সন্ধান করতে হবে যা সময়ের সাথে সাথে উপস্থিত / অদৃশ্য হয়ে যেতে পারে, তবে কেন সমস্ত কমান্ডের বিরুদ্ধে অনুসন্ধান করা হবে না? তদ্ব্যতীত, কখনও কখনও আপনার একটি ভারবস প্রতিক্রিয়া প্রয়োজন, এবং অন্যান্য সময় শুধুমাত্র ম্যাচ কমিট। এই বিকল্পগুলির দুটি সংস্করণ এখানে। এই স্ক্রিপ্টগুলি আপনার পথে রাখুন:

Git খুঁজতে ফাইল

for branch in $(git rev-list --all)
do
  if (git ls-tree -r --name-only $branch | grep --quiet "$1")
  then
     echo $branch
  fi
done

Git খুঁজতে-ফাইল-বাগাড়ম্বরপূর্ণ

for branch in $(git rev-list --all)
do
  git ls-tree -r --name-only $branch | grep "$1" | sed 's/^/'$branch': /'
done

এখন আপনি করতে পারেন

$ git find-file <regex>
sha1
sha2

$ git find-file-verbose <regex>
sha1: path/to/<regex>/searched
sha1: path/to/another/<regex>/in/same/sha
sha2: path/to/other/<regex>/in/other/sha

দেখুন যে getopt ব্যবহার করে আপনি সমস্ত স্ক্রিপ্ট, রেফস, রেফ / হেডস, ভার্বোজ হয়েছে ইত্যাদি বিকল্প অনুসন্ধানে সেই স্ক্রিপ্টটি সংশোধন করতে পারেন

$ git find-file <regex>
$ git find-file --verbose <regex>
$ git find-file --verbose --decorated --color <regex>

একটি সম্ভাব্য প্রয়োগের জন্য https://github.com/albfan/git-find-file চেকআউট করুন ।


আপনার অর্থ কি "এখন আপনি গিট-ফাইন্ড-ফাইল <regex>" করতে পারেন? আমি এটা কাজ পেয়েছিলাম, আপনাকে ধন্যবাদ!
এলিজা লিন

1
আমি ব্যক্তিগতভাবে এটিকে $ (গিট রেভিস্ট-তালিকা - সমস্ত) এর পরিবর্তে $ (গিট শাখা | কাট-সি 3-) ব্যবহার করা আরও বেশি দরকারী বলে মনে করি। আমি একগুচ্ছ কমিটস সন্ধানের বিষয়ে চিন্তা করি না, আমি নামী শাখাগুলি যত্ন করি।
ক্যাম্পাড্রেনালিন

Comm (গিট শাখা | কাট-সি 3-) ব্যবহার করার জন্য আমি স্ক্রিপ্টগুলিও পরিবর্তন করেছি কারণ সমস্ত কমিটের উপরের লুপটি খুব ধীর ছিল।
i4h

সমস্ত হট্টগোল আমি দেখেছি এটির জন্য একটি রেপো তৈরি করা ভাল। github.com/albfan/git-find-file । আমি কিছু সমস্যা খুলেছি, আরও প্রস্তাবনা দিতে বা নিখরচায় এর জন্য পিআর পাঠাতে নির্দ্বিধায় রয়েছি।
albfan

1
@ পথে লম্ব্রিক ইনস্টল করা স্ক্রিপ্টটি বাক্সের বাইরে কাজ করে, এটির একটি
গিটার

10

আপনি gitk --all"স্পর্শকৃত পাথ" এবং আপনার যে আগ্রহের পথটি ব্যবহার করছেন তার জন্য অনুসন্ধান এবং অনুসন্ধান করতে পারেন ।


3
যেমন বলা হয়েছে, গিটক - সমস্ত ব্যবহার করুন, তারপরে দেখুন | নতুন দর্শন, সমস্ত শাখা সক্ষম করুন। তারপরে আপনার অনুসন্ধানের মানদণ্ডটি সেট করুন: পেনাল্টিমেট ফিল্ডে ফাইলের নাম (ওয়াইল্ড কার্ড সহ)। শেষ পর্যন্ত: ঠিক আছে।
মাইকডব্লিউ

8

এটি অনুলিপি করুন এবং ব্যবহার করতে পেস্ট করুন git find-file SEARCHPATTERN

সমস্ত অনুসন্ধান শাখা মুদ্রণ:

git config --global alias.find-file '!for branch in `git for-each-ref --format="%(refname)" refs/heads`; do echo "${branch}:"; git ls-tree -r --name-only $branch | nl -bn -w3 | grep "$1"; done; :'

ফলাফল সহ কেবল শাখা মুদ্রণ করুন:

git config --global alias.find-file '!for branch in $(git for-each-ref --format="%(refname)" refs/heads); do if git ls-tree -r --name-only $branch | grep "$1" > /dev/null; then  echo "${branch}:"; git ls-tree -r --name-only $branch | nl -bn -w3 | grep "$1"; fi; done; :'

এই কমান্ডগুলি আপনাকে গ্লোবাল গিট ওরফে~/.gitconfig হিসাবে সরাসরি কিছু ন্যূনতম শেল স্ক্রিপ্ট যুক্ত করবে ।


এটি কেবল মাস্টার শাখায় অনুসন্ধান করছে
নাসিফ ইমতিয়াজ ওহি

এটি সমস্ত স্থানীয় শাখায় সন্ধান করে
লিওনার্দো হেরেরা

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