গিট কমিট যে কোনও শাখায় একটি স্ট্রিং চালু করেছিল তা কীভাবে খুঁজে পাব?


396

আমি একটি নির্দিষ্ট স্ট্রিং সন্ধান করতে সক্ষম হতে চাই যা কোনও শাখায় যে কোনও প্রতিশ্রুতিতে প্রবর্তিত হয়েছিল, আমি কীভাবে এটি করতে পারি? আমি কিছু খুঁজে পেয়েছি (যা আমি উইন git whatchanged32 এর জন্য সংশোধন করেছি), তবে বিভিন্ন শাখায় সন্ধান করছে বলে মনে হচ্ছে না (পাইকার্ক অংশটিকে উপেক্ষা করুন, এটি কেবল একটি এমএসএস / উইন লাইন ফিড ফিক্স)

git whatchanged -- <file> | \
grep "^commit " | \
python -c "exec(\"import sys,msvcrt,os\nmsvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)\nfor l in sys.stdin: print(l.split()[1])\")" | \
xargs -i% git show origin % -- <file>

আপনার সমাধানটি ধীর গতিতে আসলেই কিছু যায় আসে না।


উত্তর:


685

আপনি করতে পারেন:

git log -S <whatever> --source --all

স্থিত স্ট্রিং যুক্ত বা সরিয়েছে এমন সমস্ত কমিটগুলি সন্ধান করার জন্য whatever--allপ্যারামিটার মানে যে শাখা ও থেকে শুরু করতে --sourceদেখানোর জন্য যা তাদের শাখা গবেষনার যে কমিট নেতৃত্বে উপায়। -pএই প্রতিশ্রুতিগুলির প্রত্যেকটির পাশাপাশি প্রবর্তিত প্যাচগুলি প্রদর্শন করতে এটি যুক্ত করা প্রায়শই কার্যকর ।

১.7.৪ থেকে গিটের সংস্করণগুলিতেও একই রকম -Gবিকল্প রয়েছে, যা নিয়মিত প্রকাশ করেজুনিও হামানো থেকে এই ব্লগ পোস্টে ব্যাখ্যা করা হয়েছে এটির প্রকৃতপক্ষে আলাদা (এবং আরও স্পষ্ট) শব্দার্থকতা রয়েছে ।

মন্তব্যে যেমন ঠামিরা উল্লেখ করেছেন, আপনাকে অনুসন্ধান শব্দটির চারপাশে উদ্ধৃতি প্রদান করা দরকার যদি এটিতে ফাঁকা স্থান বা অন্যান্য বিশেষ অক্ষর থাকে তবে উদাহরণস্বরূপ:

git log -S 'hello world' --source --all
git log -S "dude, where's my car?" --source --all

এর -Gউপস্থিতিগুলি সন্ধান করার জন্য এখানে একটি উদাহরণ রয়েছে function foo() {:

git log -G "^(\s)*function foo[(][)](\s)*{$" --source --all

19
শ্রেষ্ঠত্বের জন্য +1। এস-তে নির্দেশ করা একটি জিনিস, জিনিসগুলি ব্যাখ্যা করা, আরও ভাল। এছাড়াও, আমি কি শাখা জিনিষ থেকে আসা দেখতে --decorate ব্যবহার করতে চান
sehe

7
@ সেহ: আপনার সুন্দর মন্তব্যের জন্য ধন্যবাদ আমি অনুমান করি যে এটি লক্ষণীয় যে --decorateপ্রতিটি শাখার ডগায় কেবলমাত্র শাখার নামটি প্রতিশ্রুতিবদ্ধ করে। অনুশীলনে আমি সত্যিই ব্যবহার করি না , --sourceবা এর --decorateপরিবর্তে git branch -a --contains <commit-hash>কোন শাখাগুলিতে আমি আগ্রহী বলে প্রতিশ্রুতিবদ্ধ রয়েছে তা অনুসন্ধান করতে ব্যবহার করি
মার্ক লংগায়ার

3
ইনলাইন
ডিফার্ক

1
@ মারকলঙ্গায়ার এটি মার্জটিতে করা পরিবর্তনগুলি দেখায় না। সেগুলিও দেখানোর জন্য কোনও পরামর্শ?
পাহলেভি ফিকরি আউলিয়া

2
আমার জন্য এটি কেবল তখনই কাজ করে যদি আমি -S এবং অনুসন্ধান শব্দটির মধ্যে স্থানটি সরিয়ে রাখি , যেমন git log -S"dude, where's my car?" --source --all,। @ribamar এছাড়াও লিখেছিলেন একটি যে উত্তর নিচে, কিন্তু এটা খুব সহজেই এই শীর্ষ উত্তর পাশে বাদ পড়ে যায়।
বাগ 313


20

মার্ক লংয়েরের উত্তরটি দুর্দান্ত, তবে আমার পক্ষে কাজ করার জন্য আমি এই সহজ সংস্করণটি পেয়েছি।

git log -S whatever

24
কেবল স্পষ্ট করে বলতে গেলে, আপনি যে প্রতিশ্রুতিটি সন্ধান করছেন তা যদি কাজ করে তবে তা ঠিক কাজ করে HEADতবে এই বিশেষ প্রশ্নটি বিশেষভাবে একটি সংগ্রহস্থলের সমস্ত শাখা জুড়ে দেখার বিষয়ে জিজ্ঞাসা করেছিল।
লংগায়ার

18

একই উত্তরগুলি নিয়ে ঘোরাঘুরি:

$ git config --global alias.find '!git log --color -p -S '
  • ! প্রয়োজন অন্য কারণ, গিটটি -S এর সাথে যুক্তিটি সঠিকভাবে পাস করে না। এই প্রতিক্রিয়া দেখুন
  • --color এবং -p হ'ল "কী পরিবর্তন হয়েছে" প্রদর্শন করতে সহায়তা করে

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

$ git find <whatever>

অথবা

$ git find <whatever> --all
$ git find <whatever> master develop

6
git log -S"string_to_search" # options like --source --reverse --all etc

এস এবং "স্ট্রিং_টো_সার্চ" এর মধ্যে স্পেস ব্যবহার না করার দিকে মনোযোগ দিন। কিছু সেটআপে (গিট 1.7.1), আপনি এর মতো একটি ত্রুটি পাবেন:

fatal: ambiguous argument 'string_to_search': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

2

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

এটি করার জন্য, আমি গিট বাইসেক্ট ব্যবহার করেছি , যা আমাকে পাপীকে দ্রুত খুঁজে পেতে দেয়।

আমি দৌড়ে এসেছি git bisect startএবং git bisect badকারণ, পুনর্বিবেচনার সমস্যাটি ছিল checked যেহেতু সমস্যাটি কখন ঘটেছিল আমি জানি না, তাই আমি "ভাল", এর জন্য প্রথম প্রতিশ্রুতিবদ্ধকে লক্ষ্য করেছিলাম git bisect good <initial sha>

তারপরে আমি কেবলমাত্র খারাপ কোডের জন্য রেপোটি অনুসন্ধান করে চলেছি। যখন আমি এটি পাওয়া, আমি দৌড়ে git bisect bad, এবং যখন এটা সেখানে ছিলাম না: git bisect good

~ 11 পদক্ষেপে, আমি ~ 1000 কমিটগুলি কভার করেছি এবং সঠিক প্রতিশ্রুতিটি পেয়েছি, যেখানে সমস্যাটি উপস্থিত হয়েছিল। খুব দুর্দান্ত।


2

নিশ্চিত না কেন গ্রহণযোগ্য উত্তরটি আমার পরিবেশে কাজ করে না, পরিশেষে আমি আমার যা প্রয়োজন তা পেতে কমান্ডের নীচে চলে যাই

git log --pretty=format:"%h - %an, %ar : %s"|grep "STRING"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.