গিট - আমি কোনও পদ্ধতি / ফাংশনের পরিবর্তনের ইতিহাসটি কীভাবে দেখতে পারি?


107

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

আমি জানি কোডটি বিশ্লেষণ করার জন্য গিটের প্রয়োজন হবে এবং বিশ্লেষণটি বিভিন্ন ভাষার জন্য পৃথক হতে পারে, তবে বেশিরভাগ ভাষায় পদ্ধতি / ফাংশন ঘোষণাগুলি দেখতে অনেকটা অনুরূপ, তাই আমি ভেবেছিলাম সম্ভবত কেউ এই বৈশিষ্ট্যটি প্রয়োগ করেছে implemented

আমি বর্তমানে যে ভাষাটি নিয়ে কাজ করছি তা হ'ল অবজেক্টিভ-সি এবং এসসিএম আমি বর্তমানে ব্যবহার করছি এটি গিট, তবে আমি জানতে আগ্রহী যে এই বৈশিষ্ট্যটি কোনও এসসিএম / ভাষার জন্য বিদ্যমান কিনা।


4
গিট জিএসওজি প্রস্তাবনায় আমি এই জাতীয় কার্যকারিতা দেখেছি।
vi।

আপনি কি এই প্রস্তাবটির কথা বলছিলেন? list-archives.org/git/…
এরিক বি


@lpapp এখানে প্রশ্নটি 10 ​​মাস আগে জিজ্ঞাসা করা হয়েছিল, অন্য প্রশ্নটি এইটির ডুপ হিসাবে চিহ্নিত করা উচিত (তারা যদি আদৌ ডুপ হয়)।
নোংরা প্রবাহ

4
@lpapp এ দুটি সম্পূর্ণ ভিন্ন প্রশ্ন। আপনি সম্ভবত এমন একটি স্ক্রিপ্ট লিখতে পারেন যা কোনও ফাংশনের নামকে বিভিন্ন রেখায় সলভ করে এবং সেই প্রশ্নগুলির কৌশলটি সেই লাইনের ইতিহাস পাওয়ার জন্য ব্যবহার করতে পারে তবে নিজেই এটি এই প্রশ্নের উত্তর দেয় না।
এরিক বি

উত্তর:


125

সাম্প্রতিক সংস্করণগুলি প্যারামিটারের git logএকটি বিশেষ ফর্ম শিখেছে -L:

-ল: <funcname>: <ফাইল>

এর মধ্যে "<start>,<end>"(বা ফাংশন নাম রেজেক্স <funcname>) প্রদত্ত রেখার পরিসীমাটির বিবর্তনের সন্ধান করুন <file>। আপনি কোনও পথস্পেক সীমাবদ্ধ নাও দিতে পারেন। এটি বর্তমানে একটি একক সংশোধন থেকে শুরু হওয়া হাঁটার মধ্যে সীমাবদ্ধ, অর্থাত্, আপনি কেবল শূন্য বা একটি ইতিবাচক পুনর্বিবেচনা যুক্তি দিতে পারেন। আপনি একাধিকবার এই বিকল্পটি নির্দিষ্ট করতে পারেন।
...
যদি “:<funcname>”তার জায়গায় দেওয়া হয় <start>এবং <end>এটি নিয়মিত প্রকাশ হয় যা প্রথম ফ্যাঙ্কনাম লাইনটি মিলবে <funcname>যা পরবর্তী ফানকাম লাইন পর্যন্ত সীমাবদ্ধ করে। “:<funcname>”পূর্ববর্তী -Lপরিসীমাটির শেষে থেকে অনুসন্ধান করা হয় , যদি থাকে তবে অন্যথায় ফাইলের শুরু থেকে। “^:<funcname>”ফাইলের শুরু থেকে অনুসন্ধান করে।

অন্য কথায়: আপনি গিটকে যদি জিজ্ঞাসা করেন তবে git log -L :myfunction:path/to/myfile.cএটি এখন খুশিতে সেই ফাংশনের পরিবর্তনের ইতিহাস মুদ্রণ করবে।


23
এটি বাক্সের বাইরে উদ্দেশ্য-সি এর জন্য কাজ করতে পারে তবে আপনি যদি অন্য ভাষার (যেমন পাইথন, রুবি ইত্যাদি) জন্য এটি করছেন তবে গিটটি ফাংশন / পদ্ধতি সনাক্ত করার জন্য আপনাকে একটি .gitattributes ফাইলের মধ্যে উপযুক্ত কনফিগারেশন যুক্ত করতে হবে যে ভাষায় ঘোষণা। পাইথন ব্যবহারের জন্য * .পি ডিফ = = অজগর, রুবি ব্যবহারের জন্য * .rb ডিফ = রুবি
সামস্পিন

4
গিট কিভাবে ফাংশনটি ট্রেস করে?
nn0p

@ nn0p আমি বেশ কয়েকটি ভাষার একটি বাক্য গঠন জ্ঞান অর্জন করে এবং এভাবে কোনও ফাংশনকে কীভাবে বিচ্ছিন্ন করতে এবং তার পরিবর্তনগুলি সনাক্ত করতে হয় তা জেনে আমি ধরে নিয়েছি।
জেসনজেনএক্স

4
@ সমাস্পিনের মন্তব্য বাড়ানো, অন্যান্য ভাষার জন্য আপনি এখানে ডক্স উল্লেখ করতে পারেন: git-scm.com/docs/gitattributes#_generating_diff_text
এডগুজ

এটি স্কেলা এবং জাভা এবং সি এর মতো ভাষার জন্যও কাজ করে না যা নেস্টেড কোঁকড়া ধনুর্বন্ধনী ব্যবহার করে (নিয়মিত এক্সপ্রেশনগুলি সাধারণভাবে এটি পরিচালনা করতে পারে না), এমনকি ফাংশনে ফাইলটিতে স্থানান্তরিত হওয়ার পরে এমনকি প্রারম্ভিক, শেষ ফর্মটি কাজ করে না এবং একই প্রতিশ্রুতিতে সংশোধিত।
রবিন সবুজ

16

ব্যবহার git gui blameস্ক্রিপ্ট-এ ব্যবহার করতে কঠিন, এবং যখন git log -Gএবং git log --pickaxeপ্রতিটি আপনি প্রদর্শন করতে পারবে পদ্ধতি সংজ্ঞা হাজির বা অদৃশ্য, আমি তাদের তৈরি করা সমস্ত পরিবর্তন তালিকা তৈরি জন্য কোনো উপায় খুঁজে পেলাম না শরীর আপনার পদ্ধতির।

তবে, আপনি ব্যবহার করতে পারেন gitattributesএবং textconvসম্পত্তিটি একসাথে সমাধান করতে পারেন যা কেবল এটি করে। যদিও এই বৈশিষ্ট্যগুলি মূলত আপনাকে বাইনারি ফাইলগুলির সাথে কাজ করতে সহায়তা করার উদ্দেশ্যে তৈরি করা হয়েছিল, তারা এখানে ঠিক তেমন কাজ করে।

কোনও আলাদা অপারেশন করার আগে আপনার আগ্রহী ফাইলগুলি বাদে গিটটি ফাইল থেকে সমস্ত লাইন অপসারণ করা কীটি হ'ল। তারপরে git log, git diffইত্যাদি কেবলমাত্র আপনার আগ্রহী সেই অঞ্চলটিই দেখতে পাবেন।

আমি অন্য ভাষায় যা করি তার রূপরেখা এখানে দেওয়া হয়; আপনি আপনার নিজের প্রয়োজনের জন্য এটি টুইট করতে পারেন।

  • একটি শর্ট শেল স্ক্রিপ্ট (বা অন্যান্য প্রোগ্রাম) লিখুন যা একটি যুক্তি গ্রহণ করে - একটি উত্স ফাইলের নাম - এবং কেবলমাত্র সেই ফাইলটির আকর্ষণীয় অংশকে আউটপুট করে (বা এটির কোনওটি আকর্ষণীয় না হলে কিছুই নয়)। উদাহরণস্বরূপ, আপনি sedনিম্নলিখিত হিসাবে ব্যবহার করতে পারেন :

    #!/bin/sh
    sed -n -e '/^int my_func(/,/^}/ p' "$1"
    
  • textconvআপনার নতুন স্ক্রিপ্টের জন্য একটি গিট ফিল্টার সংজ্ঞায়িত করুন । ( gitattributesআরও তথ্যের জন্য ম্যান পৃষ্ঠাটি দেখুন )) ফিল্টারটির নাম এবং কমান্ডের অবস্থান আপনার পছন্দ মতো কিছু হতে পারে।

    $ git config diff.my_filter.textconv /path/to/my_script
    
  • প্রশ্নের মধ্যে থাকা ফাইলটির জন্য পৃথক্ গণনা করার আগে গিটকে সেই ফিল্টারটি ব্যবহার করতে বলুন।

    $ echo "my_file diff=my_filter" >> .gitattributes
    
  • এখন, আপনি যদি আপনার ফিল্টার প্রয়োগ করা হয় তখন দৃশ্যমান পরিবর্তনগুলি ঘটাতে পারে এমন সমস্ত কমিটের তালিকা তৈরির জন্য -G.(নোটটি .) ব্যবহার করেন , আপনার আগ্রহী হবেন ঠিক সেই রকম কমিটগুলি। আপনি গিটের আলাদা রুটিন ব্যবহার করেন এমন অন্য কোনও বিকল্প যেমন --patch, এছাড়াও এই সীমাবদ্ধ দৃষ্টিভঙ্গি পান।

    $ git log -G. --patch my_file
    
  • ভয়েল!

একটি কার্যকর উন্নতি আপনি করতে চাইতে পারেন আপনার ফিল্টার স্ক্রিপ্টটির কোনও পদ্ধতির নামটিকে প্রথম আর্গুমেন্ট হিসাবে (এবং ফাইলটিকে দ্বিতীয় হিসাবে) গ্রহণ করা। এটি আপনাকে git configআপনার স্ক্রিপ্টটি সম্পাদনা না করে কেবল কল করে আগ্রহের একটি নতুন পদ্ধতি নির্দিষ্ট করতে দেয় । উদাহরণস্বরূপ, আপনি বলতে পারেন:

$ git config diff.my_filter.textconv "/path/to/my_command other_func"

অবশ্যই, ফিল্টার স্ক্রিপ্ট আপনার পছন্দমতো কিছু করতে পারে, আরও যুক্তি গ্রহণ করতে পারে বা যাই হোক না কেন: আমি এখানে যা দেখিয়েছি তার চেয়ে অনেক বেশি নমনীয়তা রয়েছে।


4
একের অধিক যুক্তি আমার পক্ষে কাজ করে নি, তবে ফাংশনটির নামটি কঠোর পরিশ্রমের মধ্যে রাখলে এটি সত্যিই দুর্দান্ত!
কিওয়ার্টজগুয়ে

উজ্জ্বল, যদিও আমি আশ্চর্য করি যে (কীভাবে) সুবিধাজনক এটি প্রচুর বিভিন্ন পদ্ধতির মধ্যে স্যুইচ করা। এছাড়াও, আপনি কি এমন কোনও প্রোগ্রাম জানেন যা পুরো সি-এর মতো একটি কার্য সম্পাদন করতে পারে?
এনএফজি

12

আপনি যে নিকটতম জিনিসটি করতে পারেন তা হ'ল ফাইলটিতে আপনার ফাংশনের অবস্থান নির্ধারণ করা (উদাহরণস্বরূপ বলুন যে আপনার ফাংশনটি i_am_buggy241-263 এর লাইনে রয়েছে foo/bar.c), তারপরে কিছু চালান:

git log -p -L 200,300:foo/bar.c

এটি কম (বা সমতুল্য পেজার) খুলবে। এখন আপনি টাইপ করতে পারেন /i_am_buggy(বা আপনার পেজার সমতুল্য) এবং পরিবর্তনের মাধ্যমে পদক্ষেপ শুরু করতে পারেন ।

এটি আপনার কোড শৈলীর উপর নির্ভর করে এমনকি কাজ করতে পারে:

git log -p -L /int i_am_buggy\(/,+30:foo/bar.c

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


মিষ্টি! এফওয়াইআই, এটি গিট ভি 1.8-এ নতুন। (অনুমান করুন আমার আপগ্রেড করা উচিত।) যদিও আরও সুনির্দিষ্ট সমাধানটি দুর্দান্ত হতে পারে ... যেমন কেউ যদি পল হুইটকারের উত্তরটি লিপিবদ্ধ করে।
গ্রেগ দাম

@ গ্রেগপ্রিস স্পষ্টতই অনুসন্ধানের প্রান্তগুলি নিয়মিত প্রকাশও হতে পারে , তাই আপনার কমপক্ষে একটি কম বা কম সুনির্দিষ্ট সূচনা পয়েন্ট থাকতে পারে।
Badp

কি শান্তি. প্রকৃতপক্ষে: আপনার নিজের রেজিএক্সপ্যাক লেখার পরিবর্তে আপনি কেবলমাত্র বলতে পারেন -L ":int myfunc:foo/bar.c"এবং সেই নামের সাথে ফাংশনটির সীমাবদ্ধ করতে পারেন । এটি দুর্দান্ত - পয়েন্টারের জন্য ধন্যবাদ! এখন যদি কেবল ফাংশন সনাক্তকরণ কিছুটা বেশি নির্ভরযোগ্য হয় ...
গ্রেগ প্রাইস

12

সমস্ত পার্থক্য খুঁজে পেতে গিট লগের একটি বিকল্প রয়েছে '-G'।

-জি পার্থক্য সন্ধান করুন যার যুক্ত বা সরানো রেখা প্রদত্ত সাথে মেলে <regex>

আপনি যে ফাংশনটির বিষয়ে যত্নশীল সেটিকে কেবল এটির একটি যথাযথ রেজেক্স দিন। উদাহরণ স্বরূপ,

$ git log --oneline -G'^int commit_tree'
40d52ff make commit_tree a library function
81b50f3 Move 'builtin-*' into a 'builtin/' subdirectory
7b9c0a6 git-commit-tree: make it usable from other builtins

4
আমি কমান্ডটি চালাইনি, তবে আমার কাছে দেখে মনে হচ্ছে যে এই আদেশটি কেবলমাত্র রেজেক্সের সাথে মেলে এমন লাইনের সাথে স্পর্শ করা কমিটগুলি দেখায় যা পুরো পদ্ধতি / ফাংশন নয়।
এরিক বি

আপনি যদি আরও প্রসঙ্গ চান, আপনি --oneline-p
lfender6445

4
তবে কী যদি পদ্ধতিতে 20 লাইন পরিবর্তন করা হয়?
এনএফজি

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

4

সঠিক উপায়টি হ'ল প্রতিবেদনের উত্তরে বর্ণিতgit log -L :function:path/to/file হিসাবে ব্যবহার করা ।

তবে তদ্ব্যতীত, যদি আপনার ফাংশনটি খুব দীর্ঘ হয় তবে আপনি কেবল প্রতিশ্রুতিগুলির জন্য কেবলমাত্র বিভিন্ন ফাংশন লাইনগুলিকেই অন্তর্নিহিত অন্তর্ভুক্ত না করে বিভিন্ন প্রতিশ্রুতিবদ্ধতার যে পরিবর্তনগুলি চালু করেছিলেন তা দেখতে পেতে পারেন যা সম্ভবত এই লাইনের একটিতে স্পর্শ করে। স্বাভাবিকের মতো diffকরে।

সাধারণত এর git logসাথে পার্থক্যগুলি দেখতে পারে -p, তবে এটি কার্যকর হয় না -L। সুতরাং আপনাকে প্রাসঙ্গিক করার grep git log -Lজন্য আপনাকে কেবল জড়িত লাইনগুলি এবং কমিট / ফাইলের শিরোনাম প্রদর্শন করতে হবে comm এখানে কৌশলটি হ'ল কেবলমাত্র টার্মিনাল রঙিন রেখাগুলি, --colorএকটি রেজেসের সাথে স্যুইচ যুক্ত করে মেলে । শেষ অবধি:

git log -L :function:path/to/file --color | grep --color=never -E -e "^(^[\[[0-9;]*[a-zA-Z])+" -3

নোট যে ^[আসল, আক্ষরিক হওয়া উচিত ^[। আপনি এগুলিকে ^ V press টি চাপিয়ে টাইপ করতে পারেন [ব্যাশে, যা Ctrl+ V, Ctrl+ [এখানে রেফারেন্স ।

সর্বশেষ -3স্যুইচ, প্রতিটি মিলিত লাইনের আগে এবং পরে আউটপুট প্রসঙ্গের 3 টি লাইন মুদ্রণ করতে দেয়। আপনি এটি আপনার প্রয়োজনের সাথে সামঞ্জস্য করতে চাইতে পারেন।


2

গিট দোষ আপনাকে দেখায় যে সর্বশেষে ফাইলের প্রতিটি লাইন পরিবর্তন করেছে; আপনি পরীক্ষা করতে লাইনগুলি নির্দিষ্ট করতে পারেন যাতে আপনার ফাংশনের বাইরের লাইনের ইতিহাস না পাওয়া যায়।


4
git gui blameআপনি পুরানো সংশোধন নেভিগেট করতে পারেন সঙ্গে ।
vi।

2
  1. প্রতিদ্বন্দ্বিতার উত্তর এবং গিট ডকgit log -L :<funcname>:<file> হিসাবে প্রদর্শিত ফাংশন ইতিহাস প্রদর্শন করুন

    যদি এটি কিছুই না দেখায় তবে আপনার ভাষা সমর্থন করার জন্য ফাইলের মতো কিছু যুক্ত করতে একটি কাস্টম হুন-হেডার সংজ্ঞায়িত করুন ।*.java diff=java.gitattributes

  2. এর সাথে কমিটের মধ্যে ফাংশন ইতিহাস দেখান git log commit1..commit2 -L :functionName:filePath

  3. ওভারলোড হওয়া ফাংশন ইতিহাস (একই নামের সাথে অনেকগুলি ফাংশন থাকতে পারে তবে বিভিন্ন পরামিতি সহ) থাকতে পারে Show git log -L :sum\(double:filepath

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