গিট: পুরো গিট ইতিহাসের উপরে একটি নির্দিষ্ট ফাইলে একটি লাইনে বিভিন্ন পরিবর্তন সমস্ত দেখান


112

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

আমার কাছে একটি (জাভাস্ক্রিপ্ট) ফাইল রয়েছে (বলুন /lib/client.js) যার মতো আমার একটি অনন্য পরিচয়কারী একটি ভেরিয়েবলের জন্য নিযুক্ত করা হয়েছে, যেমন: var identifier = "SOME_IDENTIFIER";

আপনি সংস্করণ সংখ্যার মতো শনাক্তকারী সম্পর্কে ভাবতে পারেন: পর্যায়ক্রমে, আমরা এই পরিবর্তনশীলটিকে একটি নতুন সনাক্তকারী হিসাবে পরিবর্তন করব।

আমি যা করতে চাই তা হ'ল আমরা কখনও ব্যবহার করেছি এমন অনন্য সনাক্তকারীদের সন্ধান করুন। আমি কীভাবে গিট দিয়ে এটি করতে পারি?

আমি কল্পনা করতে পারি যে গিট ইতিহাসের মাধ্যমে অনুসন্ধান করার একটি উপায় আছে এবং লাইন মিলটি মুদ্রণ করতে পারে "var identifier ="। আমি নিজে এই তালিকাটি ডি-ডুপ করতে পারি।

যাইহোক, আমি এখানে কোনও অন্তর্দৃষ্টি প্রশংসা করব। ধন্যবাদ।


উত্তর:


106

গিট ১.৮.৪ থেকে আপনার প্রশ্নের উত্তর দেওয়ার জন্য আরও প্রত্যক্ষ উপায় রয়েছে।

এই লাইনটি লাইনটি ধরে নিয়ে 110বলেছে var identifier = "SOME_IDENTIFIER";, তাহলে এটি করুন:

git log -L110,110:/lib/client.js

এটি কোডের লাইনটিকে স্পর্শ করে এমন প্রতিটি প্রতিশ্রুতি ফিরিয়ে দেবে।

[ গিট ডকুমেন্টেশন ("-L" কমান্ড লাইনের পরামিতি দেখুন)]


49

জন্য man পৃষ্ঠা দেখুন git-logএবং gitdiffcore। আমি বিশ্বাস করি যে এই আদেশটি এটি করবে, তবে এটি সম্ভবত সঠিক নয়:

git log -G "var identifier =" file.js

সম্পাদনা: আসল লাইনগুলি দেখানোর জন্য এখানে বাশ স্ক্রিপ্টের জন্য মোটামুটি শুরু। এটি আপনি যা খুঁজছেন তা হতে পারে।

for c in $(git log -G "something" --format=%H -- file.js); do
    git --no-pager grep -e "something" $c -- file.js
done

এটি কমিট হ্যাশগুলির একটি তালিকা তৈরি git log -Gকরে ব্যবহার করে আকর্ষণীয় --format=%Hকমিটগুলি সন্ধান করে। এরপরে এটি প্রতিটি আকর্ষণীয় প্রতিশ্রুতি নিয়ে পুনরাবৃত্তি করে git grepএবং সেই প্রতিশ্রুতি থেকে রেখাগুলি প্রদর্শন করার অনুরোধ করে এবং প্রতিশ্রুতিবদ্ধ হ্যাশের সাথে পূর্ববর্তী রেজেক্স ধারণ করে এমন ফাইলটি প্রদর্শন করে।


সম্পাদনা: মন্তব্যে প্রস্তাবিত -Gপরিবর্তে ব্যবহারের পরিবর্তিত হয়েছে -S


@ রব - এর জন্য ধন্যবাদ - যদিও আপনার স্ক্রিপ্টে ছোট্ট সম্পাদনা - কেবল ফাইলের নাম দেওয়া কেবলমাত্র সেই ফাইলটিকেই প্রভাবিত করে তা দেখায় - যদি কোনও প্রতিশ্রুতিবদ্ধ অন্য ফাইলগুলি তালিকাভুক্ত না হয়
অ্যাড্রিয়ান কর্নিশ

@ অ্যাড্রিয়ানকর্নিশ - খুশী এটি সহায়ক ছিল। আমি মনে করি যে ওপি কেবল একটি ফাইল দেখতে চেয়েছিল, তবে আপনি যথেষ্ট সঠিক যে ফাইলের নামটি সরিয়ে ফেলা সম্ভবত আরও সাধারণভাবে কার্যকর স্ক্রিপ্ট।
ছিনিয়ে নিন

আমার আরও কঠিন পরিস্থিতি আছে। প্রশ্নের মধ্যে থাকা ফাইলটি পহত_এ / ফাইল থেকে পাথ_বি / ফাইলে সরানো হয়েছে। এখন যখন আমি এটি পথ_বিতে করি তখন ফাইলটি যখন পথ_এ থেকে পাথ_বিতে সরে যায় কেবল তখনই এটি পরিবর্তনগুলি দেখায়। আমি যদি এটি পথ_এতে করি তবে এটি আমাকে মারাত্মক: অস্পষ্ট যুক্তি 'ফাইল' বলছে: অজানা সংশোধন বা পাথ কার্যকারী গাছের মধ্যে নয়।
অ্যান্ডি গান

@ অ্যান্ডসং - আপনি যে স্ট্রিংটি অনুসন্ধান করছেন তা যদি অনন্য হয় তবে সম্ভবত আপনি ফাইলের নামটি ছেড়ে দিতে পারেন এবং যা সন্ধান করছেন তা এখনও পেতে পারেন।
ছিনিয়ে নিন

আমার জন্য আরও সুবিধাজনক ছিল - প্রতিটি প্রতিশ্রুতি করার পরে একটি ফাঁকা রেখা রাখুন, লাইনগুলি গণনা করুন:sfile=path/to/some_file; sfind='string_to_find'; for c in $(git log -G $sfind --format=%H -- $sfile); do git --no-pager grep -e $sfind -n $c -- $sfile; echo; done
জন_ ওয়েস্ট

14

আপনি গিটকের সাহায্যে এটিও করতে পারেন:

gitk file.js

"কমিট" ড্রপ ডাউন-এ, "যুক্ত / সরানোর স্ট্রিং:" চয়ন করুন এবং তার পাশের পাঠ্য বাক্সে "var সনাক্তকারী =" লিখুন এবং সেই স্ট্রিংটি যুক্ত লাইনগুলিকে যুক্ত বা সরানোর যে কোনও প্রতিশ্রুতি হাইলাইট করা হবে।


এটি "ভার আইডেন্টিফায়ার =" যুক্ত লাইনটি যে প্রতিশ্রুতিটি যুক্ত করেছিল তা সুনির্দিষ্ট করতে সহায়তা করেছে, তবে পরবর্তী লাইনগুলি এই লাইনটি সংশোধিত করে এটি প্রদর্শন করছে না।
findchris

2
আপনি চেষ্টা করেছেন git blame file.jsনাকি git gui blame file.js?
ইথান ব্রাউন

1
আমি জানি গিট দোষ কি করে; আমি একক ভিন্নতা নয়, সংশোধনগুলির সম্পূর্ণ ইতিহাস খুঁজছি।
Findchris

1
git gui blame file.jsএটি করবে ... এটি আপনাকে কোনও ফাইলের সমস্ত সংশোধনী প্রদর্শন করবে এবং কে এটি পরিবর্তন করেছে; আপনি ইতিহাসের মাধ্যমে কেবল পিছনের দিকে ক্লিক করতে পারেন।
ইথান ব্রাউন

আমি গিটকে ভিজ্যুয়ালি দিয়ে পা রেখেছি। আমি ভাবছি এটি করার জন্য কিছু মার্জিত গিট কৌশল আছে তবে গিটক যথেষ্ট ভাল ছিল। ধন্যবাদ।
Findchris

9

আপনি যদি @ রব এর উত্তরটিকে কিছুটা মানিয়ে নেন git logতবে মূলত এটি আপনার জন্য করা হবে, যদি আপনার প্রয়োজন হয় কেবল একটি ভিজ্যুয়াল তুলনা:

git log -U0 -S "var identifier =" path/to/file

-U0অর্থ প্যাচ মোডে আউটপুট ( -p), এবং প্যাচের চারপাশে প্রসঙ্গে শূন্য লাইনগুলি দেখায়।

এমনকি আপনি শাখাগুলি জুড়ে এটি করতে পারেন:

git log -U0 -S "var identifier =" branchname1 branchname2 -- path/to/file

ডিফার শিরোনামকে দমন করার কোনও উপায় থাকতে পারে তবে আমি তার কোনওটিই জানি না।


আমার জন্য কাজ! ধন্যবাদ।
রবার্তো বোনিনি

3

ইন magit আপনার সাথে এটা করতে পারেন

l, =L

এটি আপনাকে ফাইল এবং শুরু, শেষ লাইনগুলির জন্য জিজ্ঞাসা করবে।

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