একটি রেজিএক্সপ্সের উপর ভিত্তি করে কেবলমাত্র একটি ডিফ / প্যাচের প্রাসঙ্গিক কৃপণ প্রদর্শন করুন


20

git log -G<regex> -pনির্দিষ্ট প্যাটার্নের সাথে মেলে এমন পরিবর্তনের জন্য কোডবেসের ইতিহাস অনুসন্ধান করার জন্য একটি দুর্দান্ত সরঞ্জাম। তবে এটি বেশিরভাগ অপ্রাসঙ্গিক কুকুরের সমুদ্রের ডিফ / প্যাচ আউটপুটে সম্পর্কিত কুঁচকে খুঁজে পাওয়া অপ্রতিরোধ্য হতে পারে।

git logমূল স্ট্রিং / রেজেক্সের আউটপুট অনুসন্ধান করা অবশ্যই সম্ভব , তবে এটি অনেকগুলি সম্পর্কযুক্ত পরিবর্তনের ভিজ্যুয়াল গোলমাল এবং বিভ্রান্তি হ্রাস করতে খুব কম করে।

পড়তে গিয়ে git log, আমি দেখতে পাচ্ছি --pickaxe-all, যা আমি যা চাই তার ঠিক বিপরীত: এটি আউটপুটকে (পুরো চেঞ্জসেটে) প্রসারিত করে, যেখানে আমি এটিকে সীমাবদ্ধ করতে চাই (নির্দিষ্ট কুঁচকে)।

মূলত, আমি "বুদ্ধিমানভাবে" পৃথক কুকুরের মধ্যে পার্থক্য / প্যাচকে পার্স করার জন্য এবং তারপরে প্রতিটি কুকুরের বিরুদ্ধে অনুসন্ধান চালিয়ে যাব (কেবল পরিবর্তিত রেখাগুলি লক্ষ্য করে), মেলে না এমন কুকুরটিকে ফেলে দিন এবং ফলাফলগুলি আউটপুট দিচ্ছি সেটা কর.

আমি বর্ণনা করি এমন একটি সরঞ্জাম কি বিদ্যমান? ম্যাচ / আক্রান্ত কুকুরগুলি পেতে আরও ভাল পদ্ধতির কী আছে?

কিছু প্রাথমিক গবেষণা আমি করেছি ...

  • যদি grepডিফ / প্যাচ আউটপুটটিতে এটি সম্ভব হয় এবং প্রসঙ্গ বিকল্পটি মানকে গতিশীল করে তোলে - বলুন, লাইন গণনার পরিবর্তে রেজিেক্সপ্সের মাধ্যমে - এটি যথেষ্ট হতে পারে। তবে grepঠিক সেভাবে নির্মিত হয়নি (বা প্রয়োজনে আমি এই বৈশিষ্ট্যটির জন্য অনুরোধ করছি না)।

  • আমি প্যাচটুলস স্যুটটি পেয়েছি , যা প্রাথমিকভাবে এটি আমার প্রয়োজন অনুসারে শোনায় । তবে এর manপৃষ্ঠাগুলি পড়ার পরে , সরঞ্জামগুলি regexps এর উপর ভিত্তি করে ম্যাচিং কুকুরগুলি হ্যান্ডেল করে না। (তারা শিকারীদের একটি তালিকা গ্রহণ করতে পারে, যদিও ...)

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


1
আপনি যা চেয়েছিলেন তা সুনির্দিষ্টভাবে নয় তবে গিট লগ -Gfoo চেষ্টা করুন কম + / ফু
জেমস ইয়ংম্যান

উত্তর:


7

এখানে /programming//a/35434714/5305907 আপনি যা খুঁজছেন তা করার একটি উপায় বর্ণনা করা হয়েছে । কার্যকরভাবে:

git diff -U1 | grepdiff 'console' --output-matching=hunk

এটি কেবলমাত্র শিকারিদের দেখায় যা প্রদত্ত স্ট্রিং "কনসোল" এর সাথে মেলে।


ধন্যবাদ। grepdiffমূলত আমি যা চাই আমি অবশ্যই এর কুঁকড়ে মেলা বিকল্পটি মিস করেছি! তবে ... গিট কমিটের তথ্য ছিনিয়ে নেওয়া হয়েছে grepdiff, সুতরাং একবার আপনি সম্পর্কিত কুঁচকে খুঁজে বের করার পরে আপনাকে অবশ্যই ডিটেক্ট শিরোনামের অবজেক্ট / ব্লব শা থেকে কমিট শ divine (দেখুন stackoverflow.com/a/223890/2284440 ) এটি ভালো কিছু হতে চাইgit find-object SHA --reverse | head -1 | cut -c 1-7 | { read sha ; git log -1 $sha; }
wrksprfct

এছাড়াও নোট করুন যে একটি গোলং সংস্করণ রয়েছেgrepdiff যার স্বীকৃত যুক্তিগুলির ক্ষেত্রে আরও খালি । নোট করুন যে যখন ম্যাচ করা কুনি একটি ডিফের মধ্যে শেষ কুঁড়ি, তখন এটি ভুলভাবে নিম্নলিখিত কমিটের গিট কমিট শিরোনামকে অন্তর্ভুক্ত করে — এমন কিছু যা আমাকে বুঝতে পারছে না যে পর্যন্ত কী ঘটছে!
wrksprfct

0

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

git checkout COMMIT_ID

তারপরে ভিসিএসে আরও একটি ধাপ পিছনে যান, তবে কার্যনির্বাহী ডিরেক্টরিতে নয়

git reset --soft HEAD^

(এই মুহুর্তে, সূচক এবং কার্যনির্বাহী ডিরেক্টরিগুলির মধ্যে পার্থক্যটি আপনার আগ্রহী প্যাচের সাথে মিলবে will)

আপনি এখন কার্যকর করতে পারেন git add -p। এটি একটি ইন্টারেক্টিভ অধিবেশন আরম্ভ করবে যার একটি /বিকল্প রয়েছে, যা আপনাকে কুকুরটিকে সনাক্ত করতে দেয় যা কিছু রেখার একটি রেজেক্সের সাথে মেলে। বিশেষত দরকারী যদি আপনি এই প্যাচগুলি প্রকৃতপক্ষে আরও প্রক্রিয়া করতে চান (যেমন, একটি আংশিক চেরি-পিক প্রস্তুত)।

দুর্ভাগ্যক্রমে, কমপক্ষে এখনই /কমান্ডটি add -pকেবল একটি ফাইলের মধ্যেই কাজ করে, তাই আপনাকে বেশ কয়েকটি অপ্রাসঙ্গিক ফাইলগুলি এড়িয়ে যেতে হবে।


0

@নাগু এবং উপরের লিঙ্কযুক্ত উত্তরগুলির উপরের উত্তরটির উপর ভিত্তি করে আমি git log -Gকেবল প্রাসঙ্গিক কুকুরগুলিই দেখতে সক্ষম হয়েছি ।

  1. প্রথমে আপনার লিখিত সামগ্রীটি দিয়ে $ PATH এর কোথাও একটি স্ক্রিপ্ট তৈরি করুন:

    #!/bin/bash
    
    # pickaxe-diff : external diff driver for Git.
    #                To be used with the pickaxe options (git [log|show|diff[.*] [-S|-G])
    #                to only show hunks containing the searched string/regex.
    
    path=$1
    old_file=$2
    old_hex=$3
    old_mode=$4
    new_file=$5
    new_hex=$6
    new_mode=$7
    
    filtered_diff=$(diff -u -p $old_file $new_file | \
                    grepdiff "$GREPDIFF_REGEX" --output-matching=hunk | \
                    grep -v -e '+++ ' -e '--- ')
    
    a_path="a/$path"
    b_path="b/$path"
    
    echo "diff --git $a_path $b_path"
    echo "index $old_hex..$new_hex $old_mode"
    echo "--- $a_path"
    echo "+++ $b_path"
    echo "$filtered_diff"
  2. কল করুন git log -Gএবং গিটকে pickaxe-diffবাইরের ডিফ ড্রাইভার হিসাবে স্ক্রিপ্টটি ব্যবহার করতে বলুন :

    export GREPDIFF_REGEX=<string>; 
    GIT_EXTERNAL_DIFF=pickaxe-diff git log -p --ext-diff -G $GREPDIFF_REGEX

    এটি পিক্যাক্সে-ডিফ স্ক্রিপ্টটি কেবল ভিন্নতাগুলি তৈরি করতে ব্যবহার করবে, সুতরাং বাকী git logআউটপুট (কমিট হ্যাশ, বার্তা ইত্যাদি) আউটচুড হবে।

ক্যাভেট
গিট পিক্যাক্সের যেভাবে কাজ করে তা হ'ল এটি আউটপুটকে সেই ফাইলগুলির মধ্যে সীমাবদ্ধ করে যাদের কুনিরা প্রদত্ত স্ট্রিং / রেজেক্স পরিবর্তন করে। এর অর্থ হ'ল যদি এই ফাইলে থাকা অন্য একটি হুঙ্কেও অনুসন্ধানের স্ট্রিং / রেজেক্স থাকে তবে এটি পরিবর্তন না করে, তবুও এটি উপরের স্ক্রিপ্টের সাহায্যে প্রদর্শিত হবে। এটি গ্রেপডিফের একটি সীমাবদ্ধতা। গ্রেপডিফ-তে একটি --only-matchingপতাকা যুক্ত করার জন্য প্যাচুটিলস প্রকল্পে একটি খোলা টান অনুরোধ রয়েছে , যা এই কুকুরগুলি সঠিকভাবে ফিল্টার করার জন্য প্রয়োজনীয় কার্যকারিতা সরবরাহ করবে।


আমি এই সংক্ষেপে আমার সমাধানটির একটি লিখন-আপ করেছি ।

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