কোনও ফাইলের একটি নির্দিষ্ট লাইনের জন্য কমিট লগটি পুনরুদ্ধার করবেন?


502

কোনও ফাইলের মধ্যে একটি নির্দিষ্ট লাইন স্পর্শ করা কেবল প্রতিশ্রুতিবদ্ধদের জন্য প্রতিশ্রুতিবদ্ধ লগ দেওয়ার জন্য গিট পাওয়ার কোনও উপায় আছে কি ?

পছন্দ করুন git blameতবে git blameআপনাকে সর্বশেষ প্রতিশ্রুতি দেখাবে যা একটি নির্দিষ্ট রেখাকে স্পর্শ করেছে।

আমি সত্যিই অনুরূপ লগ পেতে চাইছি, ফাইলটির যে কোনও জায়গায় কমিটের তালিকা নয়, কেবল একটি নির্দিষ্ট লাইনে স্পর্শ করে এমন কমিটস।


উত্তর:


631

গিটটিও দেখুন : আবিষ্কার করুন যা কখনই লাইনগুলির বিস্তৃতি স্পর্শ করে


গীত 1.8.4 যেহেতু , git logহয়েছে -Lলাইনের একটি সীমার বিবর্তন দেখতে।

উদাহরণস্বরূপ, ধরুন আপনি git blameআউটপুটটি দেখেন । এখানে -L 150,+11অর্থ "150 থেকে 150 + 11 পর্যন্ত কেবল রেখাগুলি দেখুন":

$ git blame -L 150,+11 -- git-web--browse.sh
a180055a git-web--browse.sh (Giuseppe Bilotta 2010-12-03 17:47:36 +0100 150)            die "The browser $browser is not
a180055a git-web--browse.sh (Giuseppe Bilotta 2010-12-03 17:47:36 +0100 151)    fi
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 152) fi
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 153) 
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 154) case "$browser" in
81f42f11 git-web--browse.sh (Giuseppe Bilotta 2010-12-03 17:47:38 +0100 155) firefox|iceweasel|seamonkey|iceape)
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 156)    # Check version because firefox < 2.0 do
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 157)    vers=$(expr "$($browser_path -version)" 
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 158)    NEWTAB='-new-tab'
5d6491c7 git-browse-help.sh (Christian Couder 2007-12-02 06:07:55 +0100 159)    test "$vers" -lt 2 && NEWTAB=''
a0685a4f git-web--browse.sh (Dmitry Potapov   2008-02-09 23:22:22 -0800 160)    "$browser_path" $NEWTAB "$@" &

এবং আপনি এখন লাইন 155 এর ইতিহাস জানতে চান।

তারপরে, ব্যবহার করুন git log। এখানে, এর -L 155,155:git-web--browse.shঅর্থ "নামের ফাইলটিতে 155 থেকে 155 রেখার বিবর্তনের সন্ধান করুন git-web--browse.sh"।

$ git log --pretty=short -u -L 155,155:git-web--browse.sh
commit 81f42f11496b9117273939c98d270af273c8a463
Author: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>

    web--browse: support opera, seamonkey and elinks

diff --git a/git-web--browse.sh b/git-web--browse.sh
--- a/git-web--browse.sh
+++ b/git-web--browse.sh
@@ -143,1 +143,1 @@
-firefox|iceweasel)
+firefox|iceweasel|seamonkey|iceape)

commit a180055a47c6793eaaba6289f623cff32644215b
Author: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>

    web--browse: coding style

diff --git a/git-web--browse.sh b/git-web--browse.sh
--- a/git-web--browse.sh
+++ b/git-web--browse.sh
@@ -142,1 +142,1 @@
-    firefox|iceweasel)
+firefox|iceweasel)

commit 5884f1fe96b33d9666a78e660042b1e3e5f9f4d9
Author: Christian Couder <chriscool@tuxfamily.org>

    Rename 'git-help--browse.sh' to 'git-web--browse.sh'.

diff --git a/git-web--browse.sh b/git-web--browse.sh
--- /dev/null
+++ b/git-web--browse.sh
@@ -0,0 +127,1 @@
+    firefox|iceweasel)

2
'গিট লগ - টোপো-অর্ডার - অনুচ্ছেদ -u -L 155,155: git-web--browse.sh' - এটি মারাত্মক ত্রুটি দিয়েছে: 'অবৈধ অবজেক্টের নাম 155,155'। গিট সংস্করণ: 1.8.3.2। কোন পরামর্শ?
বৈয়ারদেব

12
গিট ১.৮.৪ বা তারপরে আপগ্রেড করুন।
ম্যাট ম্যাকক্লিউর

4
যদি আমি "কমিটএ-তে 155 লাইনটি কী তার ইতিহাস" জানতে চাই (হেডে লাইন 155 এর পরিবর্তে) আমি কি সহজভাবে ব্যবহার করতে পারি git log commitA-hash -L 155,155:file-name?
ইদা

@ ফ্লিম, আমার দৃ strong় পছন্দ নেই।
ম্যাট ম্যাকক্লিউর

ফাইলটি সরানো / নাম পরিবর্তন করা ছাড়া ... এটি ভালভাবে কাজ করে ... মনে হয় - ফলো লাইন রেঞ্জের আরোগুলির সাথে একত্রিত হতে পছন্দ করে না।
মাইক এলারি

66

আপনি পিক-অ্যাক্সেল ব্যবহার করে কমিটের একটি সেট পেতে পারেন।

git log -S'the line from your file' -- path/to/your/file.txt

এটি আপনাকে সেই সমস্ত কমিটকে দেবে যা সেই ফাইলের সেই পাঠ্যকে প্রভাবিত করেছিল। যদি কোনও সময় ফাইলটির নাম পরিবর্তন করা হয় তবে আপনি - ফলো-প্যারেন্ট যোগ করতে পারেন।

আপনি যদি এই সম্পাদনাগুলির প্রতিটিটিতে কমিটগুলি পরিদর্শন করতে চান তবে আপনি ফলাফলটি গিট শোতে পাইপ করতে পারেন:

git log ... | xargs -n 1 git show

5
আমি নিশ্চিত না যে আমি এটি কীভাবে সাহায্য করে তা দেখছি। যদি পাঠ্যটি প্রভাবিত হয়, তবে লাইনটি আর আগের মতো নয়, তাই পিক্সেক্স আপনাকে কেবল সাম্প্রতিক পরিবর্তন দেখাবে। এরপরে আপনাকে আরও কিছু করতে হবে git log -S'the previous version of the line'ঠিক যেমন আপনি শেষ করে দিয়েছিলেন git blame -L। এবং এটি এর চেয়ে ধীরে ধীরে ধীরে ধীরে হবে git blameকারণ যেহেতু এটি কেবল নির্দিষ্ট জায়গায় নয়, সর্বত্র পাঠ্য সন্ধান করতে হবে।
ক্যাস্যাবেল

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

3
এটিকে পিক-কুড়াল বলা হয় কেন ? :)
সিপরিয়ান টমোইগă

43

গিট 1.8.4 এ প্রয়োগ করা নীচের কমান্ডটি ব্যবহার করার চেষ্টা করুন।

git log -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

সুতরাং, আপনার ক্ষেত্রে upperLimit& lowerLimitস্পর্শ করা হয়line_number

আরও তথ্য - https://www.techpurohit.com/list-some-useful-git-commands


2
আমি মনে করি --pretty=shortব্যবহার করার সময় উপেক্ষা করা হয় -L। দয়া করে সংশোধন করুন
ভিক সিডুবলিয়েিউ

14

এটি করার একটি অত্যন্ত সহজ উপায় হল ভিএম-পলাতক ব্যবহার করে । কেবলমাত্র ভিএম-তে ফাইলটি খুলুন, আপনি যে লাইনটি ব্যবহার করতে আগ্রহী তা নির্বাচন করুন V, তারপরে প্রবেশ করুন

:Glog

এখন আপনি ব্যবহার করতে পারেন :cnextএবং :cprevসেই লাইনটি সংশোধন করা হয়েছে এমন ফাইলের সমস্ত সংশোধনী দেখতে পারেন। যে কোনও সময়ে :Gblameশ, লেখক এবং তারিখের তথ্য দেখতে প্রবেশ করুন ।


13

সরলকরণ @ ম্যাট এর উত্তর -

git blame -L14,15 -- <file_path>

এখানে আপনি একটি লাইনের জন্য দোষ পাবেন 14 to 15

যেহেতু -Lবিকল্প আশা Rangeএকটি PARAM হিসাবে আমরা একটি পেতে পারে না Blameব্যবহার করে একটি একক লাইন জন্য -Loption`

উল্লেখ


10

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

যদি আপনি যথেষ্ট ভাগ্যবান হন যে লাইনে সর্বদা কিছু শনাক্তকরণ বৈশিষ্ট্য রয়েছে, উদাহরণস্বরূপ এমন কোনও ভেরিয়েবলের একটি অ্যাসাইনমেন্ট, যার নাম কখনও পরিবর্তন হয় না, আপনি এর জন্য রেজেক্স পছন্দটি ব্যবহার করতে পারেন git blame -L। উদাহরণ স্বরূপ:

git blame -L '/variable_name *= */',+1

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

আমি মনে করি আপনি কিছু হ্যাক করতে পারেন। আমার কাছে এখনই কোড লেখার সময় নেই, তবে ... এই লাইন বরাবর কিছু। চালান git blame -n -L $n,$n $file। প্রথম ক্ষেত্র পূর্ববর্তী স্পর্শ কমিট, এবং দ্বিতীয় ক্ষেত্র লাইন সংখ্যা হয় যে যেহেতু এটা পরিবর্তন করেছি পারে, কমিট। এগুলি ধরুন এবং চালান git blame -n $n,$n $commit^ $file, শেষ বার ফাইলটি পরিবর্তনের আগে কমিট থেকে শুরু করা একই জিনিস।

(মনে রাখবেন যে লাইনটি পরিবর্তিত শেষ প্রতিশ্রুতি যদি একীভূত অঙ্গীকার ছিল তবে এটি আপনাকে ব্যর্থ করবে merge একত্রিত হওয়া সংঘাতের সমাধানের অংশ হিসাবে লাইনটি পরিবর্তিত হলে এটির প্রাথমিক উপায় হতে পারে।)

সম্পাদনা: আমি আজকের মার্চ ২০১১ থেকে এই মেইলিং তালিকা পোস্ট জুড়ে ঘটলাম, যার উল্লেখ রয়েছে tigএবং git guiএমন একটি বৈশিষ্ট্য রয়েছে যা আপনাকে এটি করতে সহায়তা করবে। দেখে মনে হচ্ছে এই বৈশিষ্ট্যটি বিবেচিত হয়েছে, তবে শেষ হয়নি, গিটের জন্য।


6

এটি ফাইলের লাইন দেখানোর git blameজন্য প্রতিটি অর্থবহ সংশোধনের জন্য কল করবে :$LINE$FILE

git log --format=format:%H $FILE | xargs -L 1 git blame $FILE -L $LINE,$LINE

যথারীতি, দোষ প্রতিটি লাইনের শুরুতে সংশোধন সংখ্যাটি দেখায়। আপনি সংযোজন করতে পারেন

| sort | uniq -c

একত্রিত ফলাফল পেতে, কমিটের তালিকার মতো এমন কিছু যা এই লাইনটি পরিবর্তন করেছে। (একদম নয়, যদি কোডটি কেবল চারদিকে সরানো থাকে তবে এটি লাইনটির বিভিন্ন বিষয়বস্তুর জন্য একই কমিট আইডিটি দুবার প্রদর্শন করতে পারে a আরও বিশদ বিশ্লেষণের জন্য আপনাকে git blameসংলগ্ন কমিটির জন্য ফলাফলের তুলনায় পিছনে তুলতে হবে Anyone কেউ? )


আবার আমি মনে করি এটি কার্যকর হয় না, কারণ এটি লাইনটির পূর্ববর্তী অবস্থানটি ট্র্যাক করে না। সুতরাং যদি 2 টি কমিট পূর্বে একটি লাইন যুক্ত করা হয় তবে আপনি অন্য লাইনের দিকে তাকিয়ে থাকবেন
ভিক সিডুবলিয়েউ

6

এখানে এমন একটি সমাধান রয়েছে যা গিটের উরফ সংজ্ঞায়িত করে, সুতরাং আপনি এটির মতো এটি ব্যবহার করতে সক্ষম হবেন:

git rblame -M -n -L '/REGEX/,+1' FILE

আউটপুট উদাহরণ:

00000000 18 (Not Committed Yet 2013-08-19 13:04:52 +0000 728) fooREGEXbar
15227b97 18 (User1 2013-07-11 18:51:26 +0000 728) fooREGEX
1748695d 23 (User2 2013-03-19 21:09:09 +0000 741) REGEXbar

আপনি আপনার .gitconfig এ উপন্যাসটি সংজ্ঞায়িত করতে পারেন বা কেবল নিম্নলিখিত কমান্ডটি চালাতে পারেন

git config alias.rblame !sh -c 'while line=$(git blame "$@" $commit 2>/dev/null); do commit=${line:0:8}^; [ 00000000^ == $commit ] && commit=$(git rev-parse HEAD); echo $line; done' dumb_param

এটি একটি কুরুচিপূর্ণ এক-লাইনার, সুতরাং এখানে একটি ডি-অবফসকেটেড সমমানের বাশ ফাংশন রয়েছে:

git-rblame () {
    local commit line
    while line=$(git blame "$@" $commit 2>/dev/null); do
        commit="${line:0:8}^"
        if [ "00000000^" == "$commit" ]; then
            commit=$(git rev-parse HEAD)
        fi
        echo $line
    done
}

পিক্যাক্স সলিউশন ( গিট লগ - পিক্সেক্স-রিজেক্স-এস'আরজিএক্স ' ) কেবল আপনাকে রেখার সংযোজন / মুছে ফেলা দেবে, নিয়মিত অভিব্যক্তি সম্বলিত লাইনের অন্যান্য পরিবর্তনগুলি নয়।

এই সমাধানের একটি সীমাবদ্ধতা হ'ল গিট দোষ কেবলমাত্র 1 ম REGEX ম্যাচটি দেয়, সুতরাং একাধিক ম্যাচ উপস্থিত থাকলে পুনরাবৃত্তি অন্য লাইনটি অনুসরণ করতে "লাফিয়ে" যেতে পারে। এই "লাফানো" চিহ্নিত করার জন্য পুরো ইতিহাসের আউটপুটটি পরীক্ষা করে দেখুন এবং তারপরে পরজীবী লাইনগুলিকে উপেক্ষা করার জন্য আপনার REGEX ঠিক করুন fix

পরিশেষে, এখানে একটি বিকল্প সংস্করণ যা সম্পূর্ণ প্রতিচ্ছবি পেতে প্রতিটি প্রতিশ্রুতিতে গিট শো চালায়:

git config alias.rblameshow !sh -c 'while line=$(git blame "$@" $commit 2>/dev/null); do commit=${line:0:8}^; [ 00000000^ == $commit ] && commit=$(git rev-parse HEAD); git show $commit; done' dumb_param

2

আপনি মিশ্রিত করা যাবে git blameএবং git logকমান্ড Git দোষ কমান্ডে কমিট এবং তাদের যোগ প্রতিটি সারসংক্ষেপ পুনরুদ্ধার করতে। নীচের ব্যাশ + অ্যাজক স্ক্রিপ্টের মতো কিছু। এটি কোড কমেন্ট ইনলাইন হিসাবে প্রতিশ্রুতি সংক্ষিপ্তকরণ যুক্ত করে।

git blame FILE_NAME | awk -F" " \
'{
   commit = substr($0, 0, 8);
   if (!a[commit]) {
     query = "git log --oneline -n 1 " commit " --";
     (query | getline a[commit]);
   }
   print $0 "  // " substr(a[commit], 9);
 }'

এক লাইনে:

git blame FILE_NAME | awk -F" " '{ commit = substr($0, 0, 8); if (!a[commit]) { query = "git log --oneline -n 1 " commit " --"; (query | getline a[commit]); } print $0 "  // " substr(a[commit], 9); }'

2

আমার ক্ষেত্রে লাইন নম্বর সময়ের সাথে সাথে অনেক পরিবর্তন হয়েছিল। আমি গিট ১.৮.৩ এও ছিল যা "গিট দোষ-এল" তে রেগেক্সকে সমর্থন করে না। (RHEL7 এর এখনও 1.8.3 রয়েছে)

myfile=haproxy.cfg
git rev-list HEAD -- $myfile | while read i
do
    git diff -U0 ${i}^ $i $myfile | sed "s/^/$i /"
done | grep "<sometext>"

এক রৈখিক:

myfile=<myfile> ; git rev-list HEAD -- $myfile | while read i; do     git diff -U0 ${i}^ $i $myfile | sed "s/^/$i /"; done | grep "<sometext>"

এটি অবশ্যই একটি স্ক্রিপ্ট বা একটি ফাংশন তৈরি করা যেতে পারে।

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