একটি নির্দিষ্ট স্ট্রিংয়ের জন্য কীভাবে সমস্ত গিট এবং মার্কুরিয়াল সংগ্রহস্থলটিতে সন্ধান করবেন?


287

আমার কয়েকটি শাখা এবং ঝুঁকিপূর্ণ কমিট সহ একটি গিট সংগ্রহস্থল রয়েছে। আমি একটি নির্দিষ্ট স্ট্রিংয়ের জন্য সংগ্রহস্থলগুলিতে এই জাতীয় কমিটগুলি অনুসন্ধান করতে চাই।

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

আমি সুইচটি বিবেচনা করার সাথে সাথে মার্চুরিয়ালে কীভাবে এটি করব তা জানতেও চাই।


উত্তর:


331

আপনি ঝুঁকির সাথে কমিটগুলি দেখতে পাচ্ছেন git log -g

-g, --walk-reflogs
 Instead of walking the commit ancestry chain, walk reflog entries from
 the most recent one to older ones. 

সুতরাং আপনি ঝুঁকছেন এমন প্রতিশ্রুতিবদ্ধ বার্তায় একটি নির্দিষ্ট স্ট্রিং সন্ধান করতে এটি করতে পারেন:

git log -g --grep=search_for_this

বিকল্পভাবে, আপনি যদি কোনও নির্দিষ্ট স্ট্রিংয়ের জন্য পরিবর্তনগুলি সন্ধান করতে চান তবে আপনি পিক্যাক্স অনুসন্ধান বিকল্পটি "-S" ব্যবহার করতে পারেন:

git log -g -Ssearch_for_this
# this also works but may be slower, it only shows text-added results
git grep search_for_this $(git log -g --pretty=format:%h)

গিট 1.7.4 -G বিকল্পটি যুক্ত করবে , আপনাকে <Gregexp> পাস করার অনুমতি দিলে <regexp> সমেত একটি লাইন কখন সরানো হয়েছিল, যা -এস করতে পারে না find -এস কেবল তখনই জানায় যখন স্ট্রিং যুক্ত মোট রেখার সংখ্যা পরিবর্তিত হয় (যেমন স্ট্রিং যুক্ত / অপসারণ)।

অবশেষে, আপনি ঝাঁকুনির সাথে সম্পাদিত কটিটি কল্পনা করতে গিটক ব্যবহার করতে পারেন:

gitk --all $(git log -g --pretty=format:%h)

এবং তারপরে বিভক্ত ফাইলটি অনুসন্ধান করতে এর অনুসন্ধান বৈশিষ্ট্যগুলি ব্যবহার করুন। অনুপস্থিত প্রতিশ্রুতি ধরে নিয়ে এই সমস্ত কাজ "মেয়াদোত্তীর্ণ" হয়নি এবং আবর্জনা সংগ্রহ করা হয়েছে, এটি যদি 30 দিনের জন্য ঝুঁকছে এবং আপনি পুনরায় ব্লগ বা মেয়াদ শেষ করে এমন কোনও আদেশ চালাচ্ছেন তবে এটি ঘটতে পারে।


4
সম্ভবত (বৃহত্তর) সংখ্যক কমিটের উপর "গিট গ্রেপ" চালনার পরিবর্তে, যা কোনও প্রকল্পে কোথাও 'অনুসন্ধান_প্রাপ্ত_সর্বস্ব' রয়েছে এমন সমস্ত কমিটগুলি খুঁজে পেতে পারে, তথাকথিত "পিক্সেক্স" অনুসন্ধান ব্যবহার করবে, যেমন লগের জন্য '-এস' বিকল্পটি ব্যবহার করবে , যা প্রদত্ত স্ট্রিংটি চালু বা সরিয়ে ফেলেছে বা প্রদত্ত স্ট্রিংয়ের উপস্থিতির সংখ্যা পরিবর্তিত হয়েছে এমনটি আরও সঠিক হতে পারে।
জাকুব নরবস্কি

5
আপনি একাধিক শাখা নির্দিষ্ট করতে পারেন, বা '- সমস্ত' বিকল্পটি ব্যবহার করতে পারেন, যেমন 'গিট লগ --grep = "প্রতিশ্রুতি বার্তায় স্ট্রিং"
জাকুব নরবস্কি

এটি আমাকে মাত্র 2 দিনের কাজের কাজের জন্য একটি হারিয়ে প্রতিশ্রুতি সন্ধান করার অনুমতি দিয়েছে। সম্পূর্ণরূপে আমার গাধা সংরক্ষণ করা, ধন্যবাদ!
মাইক চেম্বারলাইন

2
আমি এমন কিছু পরিস্থিতি পেরিয়ে এসেছি যেখানে আমার ডেটাবেজে কমিট হয়েছিল তবে আমার রিফ্লগে নয়। আমি জানি না এটি কতটা সাধারণ। আমি বিভিন্ন এইচজি / গিট ব্রিজ চেষ্টা করছিলাম। আমি মনে করি এটি বাদ পড়ে থাকা স্ট্যাশগুলির সাথেও উত্থিত হতে পারে। যাই হোক না কেন, এই ওরফে এই মামলাগুলি ধরার জন্য দুর্দান্তভাবে কাজ করে:!git fsck --unreachable | sed -ne 's/^unreachable commit //p' | xargs git log --no-walk
সন্দেহজনক জিম

দ্রষ্টব্য, এতে নোটের বিষয়গুলি অনুসন্ধান করার অন্তর্ভুক্ত নেই। এটি এখনও কার্যকর করা হয়নি: git.661346.n2.nabble.com/…
অ্যান্টনি স্টাবস

54

মার্চুরিয়ালে আপনি hg log --keywordপ্রতিশ্রুতিবদ্ধ বার্তাগুলিতে কীওয়ার্ড hg log --userঅনুসন্ধান করতে এবং কোনও নির্দিষ্ট ব্যবহারকারীর সন্ধান করতে ব্যবহার করেন। hg help logলগ সীমাবদ্ধ করার অন্যান্য উপায়গুলি দেখুন ।


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

1
hg log -kঅনুসন্ধানগুলি চেঞ্জসেটগুলিতে ব্যবহারকারীর নাম এবং ফাইলের নামও প্রতিশ্রুতি দেয় (আমি হ'ল এইচজি-তে বুঝতে পারি না এমন কয়েকটি বিষয়গুলির মধ্যে এটি একটি যা কমান্ড.পি.লগ-এ দেখি)। প্রতিশ্রুতিবদ্ধ বার্তা এবং ফাইলের নাম অনুসন্ধান করার জন্য পৃথক বিকল্প থাকতে হবে। মনে hg log --template '{desc}\n'|grepহচ্ছে এটি নিশ্চিত উপায়।
জেফ্রি ঝেং

@ জিফ্রেজেহেং: এটি করার উপায় রয়েছে। "এইচজি সহায়তা রিসেটস" দেখুন, ডেস্ক (), ব্যবহারকারী () এবং ফাইল () ফাংশনগুলি দেখুন। এই আচরণের বেশিরভাগ ক্ষেত্রে এইচজি লগ স্যুইচও রয়েছে। আমার অভিজ্ঞতায়, যদিও -k / কীওয়ার্ড () হ'ল জিনিস অনুসন্ধান করার সবচেয়ে সহায়ক উপায়।
কেভিন হর্ন

প্রকৃত প্রতিশ্রুতিবদ্ধ ফাইল সামগ্রীগুলির মধ্যে একটি কীভাবে অনুসন্ধান করবে ... ভিন্নতা? আমি জানি এটি একটি ধীর অনুসন্ধান হবে তবে আমি অনুপস্থিত ফাংশনটির নামের জন্য গভীর অনুসন্ধান করতে চাই।
জোনাথন

ওহ এখানে এটি:hg grep --all <term>
জোনাথন

24

ছাড়াও richq উত্তর ব্যবহারের git log -g --grep=<regexp>বা git grep -e <regexp> $(git log -g --pretty=format:%h): junio সি Hamano, বর্তমান Git রক্ষণাবেক্ষণকারী দ্বারা নিম্নলিখিত ব্লগ পোস্ট কটাক্ষপাত করা


সারসংক্ষেপ

উভয় Git, grep এবং Git লগ --grep হয় লাইন ভিত্তিক , যে তারা লাইন উল্লিখিত মিল ধরণ জন্য, দেখুন।

যে কোনও প্যাটার্নের সাথে মিল রয়েছে ( যেগুলি অন্তর্নিহিত বা শব্দার্থক) তা সন্ধান করতে আপনি git log --grep=<foo> --grep=<bar>(বা git log --author=<foo> --grep=<bar>এটি অভ্যন্তরীণভাবে দুটিতে অনুবাদ --grep) ব্যবহার করতে পারেন ।

লাইন ভিত্তিক হওয়ার কারণে দরকারী এবং শব্দার্থিক ব্যবহার করা git log --all-match --grep=<foo> --grep=<bar>এটি কমিট যে হয়েছে উভয় প্রথম লাইন ম্যাচিং এবং দ্বিতীয় কোথাও মিলে লাইন।

সঙ্গে git grepআপনি একাধিক ধরন (সব যা ব্যবহার করা আবশ্যক একত্রিত করতে পারেন -e <regexp>সঙ্গে ফর্ম) --or(যা ডিফল্ট), --and, --not, (এবং )। গ্রেপের জন্য --all-matchএই ফাইলটির অবশ্যই লাইন থাকা উচিত যা প্রতিটি বিকল্পের সাথে মেলে।


আরে জাকুব, মন এখানে those ব্লগ পোস্টগুলি থেকে উদ্ধৃতি / সংক্ষেপগুলি সংহত করছেন? এই মুহুর্তে মদ লিংকের একমাত্র উত্তর বলে মনে হচ্ছে।
নাথন টগি

11

আরকিউ এর উত্তরে বিল্ডিং করে, আমি দেখতে পেয়েছি যে এই লাইনটি আমার যা ইচ্ছা তা করে:

git grep "search for something" $(git log -g --pretty=format:%h -S"search for something")

যা প্রতিশ্রুতিবদ্ধ আইডি, ফাইলের নাম এবং মেলবন্ধন লাইনটি এভাবে প্রকাশ করবে:

91ba969:testFile:this is a test

... স্ট্যান্ডার্ড গিট গ্রেপ কমান্ডে অন্তর্ভুক্ত করার জন্য এটি কোনও দুর্দান্ত বিকল্প হতে পারে কি কেউ সম্মত হন?


5

যুক্তি হিসাবে রেফারেন্স গ্রহণ করে যে কোনও কমান্ড --allম্যান পৃষ্ঠাতে নথিভুক্ত বিকল্পটি git rev-listনিম্নলিখিত হিসাবে গ্রহণ করবে :

   --all
       Pretend as if all the refs in $GIT_DIR/refs/ are listed on the
       command line as <commit>.

সুতরাং উদাহরণস্বরূপ, git log -Sstring --allসমস্ত stringশাখাগুলি প্রদর্শিত হবে যা উল্লেখ করা হয়েছে এবং যা শাখা বা কোনও ট্যাগ থেকে অ্যাক্সেসযোগ্য (আমি ধরে নিচ্ছি যে আপনার ঝোলা কমিটগুলি কমপক্ষে একটি ট্যাগ দিয়ে নাম দেওয়া হয়েছে)।


3
এটি এটির ক্ষেত্রে দেখা যায় না git grep, যেখানে --allঅনুবাদ করা / হিসাবে ব্যবহৃত হবে বলে মনে হয় --all-match। এটি আমার কাছে একটি বাগের মতো দেখাচ্ছে .. গিট ১.7.২.৩ ব্যবহার $(git rev-list --all)করে ( কাজগুলি ব্যবহার করে)।
নীল রঙের

5

মার্চুরিয়াল দিয়ে আপনি একটি

$ hg grep "search for this" [file...]

অন্যান্য বিকল্প রয়েছে যা অনুসন্ধানের সংবিধানকে সীমিত করে দেয়।


1
আমি hg grep --all
জোনাথন

2

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

এটি রেপোতে নামযুক্ত সমস্ত শাখা অন্তর্ভুক্ত করবে। মার্চুরিয়ালের ঝোলা ব্লক আফিকের মতো কিছু নেই।


1
এই উত্তরটি নির্দিষ্ট সমস্যার সাথে কীভাবে প্রাসঙ্গিক তা আমি বুঝতে পারি না।
jribeiro

3
এটি মার্চুরিয়ালের প্রশ্নের উত্তর, যা মূল প্রশ্নটি শেষ অনুচ্ছেদে জিজ্ঞাসা করেছে।
কার্ট শেলফথআউট

1

আপনি যদি ভিআইএম ব্যবহারকারী হন তবে আপনি টিগ ইনস্টল করতে পারেন (অ্যাপ্লিকেশনটি ইনস্টল করুন), এবং ভিএম-তে অনুসন্ধান করতে একই কমান্ড ব্যবহার করতে পারেন

https://blogs.atlassian.com/2013/05/git-tig/


1

এখনও উল্লেখ না করা আরও একটি সমাধান যুক্ত করতে, আমাকে বলতে হয়েছিল যে গিট্জের গ্রাফিকাল অনুসন্ধান বাক্সটি ব্যবহার করা আমার পক্ষে সহজ সমাধান ছিল। এটি প্রথম ঘটনাটি নির্বাচন করবে এবং আপনি পরবর্তীটি সিটিআরএল-জি-এর সাথে খুঁজে পাবেন।


1

গিটের একটি কমান্ড যা আমি মনে করি একটি স্ট্রিং খুঁজে পাওয়া অনেক সহজ:

git log --pretty=oneline --grep "string to search"

গিট 2.0.4 এ কাজ করে

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