গিটে দুটি কমিটের মধ্যে পরিবর্তন হওয়া লাইনের সংখ্যা আমি কীভাবে গণনা করতে পারি?


746

গেটে দুটি কমিটের মধ্যে পরিবর্তন হওয়া লাইনের সংখ্যা গণনা করার কোনও সহজ উপায় কি?

আমি জানি আমি একটি করতে পারি git diffএবং লাইনগুলি গণনা করতে পারি তবে এটি ক্লান্তিকর বলে মনে হয়। আমি আরও জানতে চাই যে আমি কীভাবে এটি করতে পারি, কেবলমাত্র লাইনিকাউন্টগুলিতে আমার নিজস্ব প্রতিশ্রুতিগুলি সহ।


3
আপনি বিটবাকেট তাকান।
অ্যালেক্স 78191

উত্তর:


1111

আপনি --statবিকল্পটি চান git diffবা আপনি যদি এটি কোনও স্ক্রিপ্টে পার্স করতে চান তবে --numstatবিকল্পটি।

git diff --stat <commit-ish> <commit-ish>

--statআপনি মার্জ হওয়ার পরে দেখতে অভ্যস্ত মানব-পঠনযোগ্য আউটপুট উত্পাদন করে; --numstatস্ক্রিপ্টগুলি সহজেই ব্যাখ্যা করতে পারে এমন একটি দুর্দান্ত টেবিল বিন্যাস উত্পাদন করে।

আমি একরকম মিস করেছি যে আপনি একই সময়ে একাধিক কমিটিতে এটি করতে চেয়েছিলেন - এটি একটি কাজ git log। রন ডিভেরা এতে স্পর্শ করেছেন তবে তিনি যা উল্লেখ করেছেন তার চেয়ে আপনি আসলে আরও অনেক কিছু করতে পারেন। যেহেতু git logঅভ্যন্তরীণভাবে অনুরোধকৃত তথ্য মুদ্রণের জন্য ডিফ যন্ত্রগুলিকে কল করে, আপনি এটিকে পৃথক স্ট্যাটাসের যে কোনও বিকল্প দিতে পারেন - কেবল তা নয় --shortstat। আপনি সম্ভবত যা ব্যবহার করতে চান তা হ'ল:

git log --author="Your name" --stat <commit1>..<commit2>

তবে আপনি --numstatবা ব্যবহার করতে পারেন --shortstatgit logঅন্যান্য বিভিন্ন উপায়েও কমিটগুলি নির্বাচন করতে পারে - ডকুমেন্টেশনটি দেখুন । আপনি --since( যেমন প্রতিশ্রুতি সীমা নির্দিষ্টকরণের চেয়ে কেবল গত সপ্তাহ থেকে কমিটগুলি নির্বাচন করুন) এবং --no-merges(মার্ট কমিটগুলি আসলে পরিবর্তনগুলি প্রবর্তন করে না), পাশাপাশি সুন্দর আউটপুট বিকল্পগুলির ( --pretty=oneline, short, medium, full...) মতো জিনিসে আপনার আগ্রহী হতে পারে ।

গিট লগ থেকে প্রতি-প্রতিশ্রুতি পরিবর্তনের পরিবর্তে মোট পরিবর্তনগুলি পেতে এখানে এক-লাইনার (কমিট নির্বাচন বিকল্পগুলি পছন্দসই পরিবর্তন করুন - এটি আপনার দ্বারা কমিট 1, কমিট 2 এ কমিট করুন):

git log --numstat --pretty="%H" --author="Your Name" commit1..commit2 | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("+%d, -%d\n", plus, minus)}'

(আপনাকে গিট লগকে এই প্রতিশ্রুতি সম্পর্কিত কিছু সনাক্তকারী তথ্য প্রিন্ট করতে হবে; আমি নির্বিচারে হ্যাশটি বেছে নিয়েছিলাম, তারপর কেবল তিনটি ক্ষেত্রের সাথে লাইনগুলি বেছে নেওয়ার জন্য জাজি ব্যবহার করা হয়েছিল, যা স্ট্যাটাসের তথ্য সহ)


2
এটি "পরিবর্তিত রেখাগুলি" সম্পর্কে মূল প্রশ্নের উত্তর দেয় না। একটি লাইন পরিবর্তন inোকানো এবং মুছে ফেলা উভয় হিসাবে গণনা করা হয়। পরিবর্তিত রেখাগুলির সংখ্যা গণনা করতে এখানে বর্ণিত চেয়ে বেশি কাজ করা দরকার।
ভিল লাইটিলা

12
@ ভিলাইলটাইলা: এটি যতটা কাছাকাছি আপনি একটি অযৌক্তিক পরিশ্রমের প্রচেষ্টা ছাড়াই পেতে পারেন ততই কাছাকাছি এবং ওপি এবং অন্য 15 জনের পক্ষে এটি যথেষ্ট ভাল ছিল। (পরিবর্তিত রেখাটি যখন একটি যুক্ত রেখা এবং মুছে ফেলা লাইন হয়ে যায় তখন আপনি কীভাবে সংজ্ঞা দেন? লাইন দৈর্ঘ্যের ভগ্নাংশ হিসাবে - এবং + লাইনের মধ্যবর্তী দূরত্ব সম্পাদনা করে?) আমরা সবাই জানি যে পরিবর্তনগুলি দ্বিগুণ হয়; আমরা এটিকে কেবল পরিবর্তনের পরিমাণের একটি দরকারী মেট্রিক বলতে পারি এবং আমাদের জীবন নিয়ে এগিয়ে যেতে পারি।
ক্যাসাবেল

188
git diff --shortstat <commit1> <commit2>আমি চেয়েছিলাম এক।
কিম

9
অবগতির জন্য, তারিখ ফর্ম্যাট --sinceএবং --until: ভালো কিছু হয় yesterday, 1 month 2 weeks 3 days 1 hour 1 second agoঅথবা1979-02-26 18:30:00
juanmirocks

4
@ ব্রায়সন হ্যাঁ, সেই কারণেই এই লাইনটি বলেছে <commit-ish>- এটি আক্ষরিক কমিট, শাখা, ট্যাগ এবং সাধারণভাবে রেফ সহ কোনও অঙ্গীকারের প্রতিনিধিত্ব করে with এছাড়াও দেখুন স্ট্যাকওভারফ্লো.com
জিজ্ঞাসা /

193

অলস জন্য, ব্যবহার করুন git log --stat


14
আমি এটি দরকারী খুঁজে পেয়েছি, -10আগের দশটি কমিটগুলি দেখানোর জন্য একটি যুক্ত করেছি ।
কোয়েলটন বি। হিগগিনবটম

2
কমিটের ইতিহাস দেখা শেষ Qহয়ে গেলে টার্মিনালে ফিরে আসতে টাইপ করুন ।
স্টিভয়েসিয়াক

180
git diff --shortstat

আপনাকে পরিবর্তিত ও সংযুক্ত লাইনের সংখ্যা দেয়। এটি কেবল অনাস্থাবিহীন পরিবর্তনের সাথে কাজ করে। একটি শাখার সাথে তুলনা করতে:

git diff --shortstat some-branch

3
শান্ত! তবে .. সচেতন থাকুন যে এটি কেবল
অচিহ্নবদ্ধ

3
আপনি যদি এর সাথে পরিবর্তনগুলি মঞ্চস্থ করে git addgit diff --shortstat --cached
রেখেছেন তবে

2463 টি ফাইল পরিবর্তন হয়েছে, 39745 সন্নিবেশ (+), 21383 মুছে ফেলা (-) আমি আসলে গত মাসে 5 কে থেকে 10 কে প্রায় মুছে ফেলেছি। এগুলি প্রায় সমস্ত কিছু আমি ঘুরে বেড়ানো থেকে আলাদা করে চলেছি। কিছু একটা সমস্যা. এটি মুছে ফেলা ফাইল বা কিছু অন্তর্ভুক্ত না?
jgmjgm

46
git diff --stat commit1 commit2

সম্পাদনা: আপনাকেও কমিটগুলি নির্দিষ্ট করতে হবে (পরামিতি ছাড়াই এটি সূচকের বিপরীতে ওয়ার্কিং ডিরেক্টরিকে তুলনা করে)। যেমন

git diff --stat HEAD^ HEAD

এর পিতামাতার HEADসাথে তুলনা করা HEAD


1
সত্যই ব্যবহার করার দরকার নেই diff-index- diffসীমান্ত সবকিছু পরিচালনা করতে পারে; আমি বিশ্বাস করি যে ঘটনাটি এর diff-indexআওতাধীন রয়েছে --cached/--staged। (এবং diff-indexওপি যেমনটি জিজ্ঞাসা করেছেন তেমন দুটি নির্বিচারে কমিটের তুলনা করার জন্য কোনও উপায় নেই use )
ক্যাসাবেল ২ '

এর আউটপুট আমার পক্ষে কিছুই নয়।
মাইক

@ মাইক: আপনি কি ক্যারেট ছেড়েছিলেন? আপনার সাম্প্রতিকতম প্রতিশ্রুতিটি কি একীকরণের অঙ্গীকার করেছিল? গিট যদি বলে যে কোনও ভিন্নতা নেই, কারণ এটির কোনও ভিন্নতা নেই।
ক্যাসাবেল

6
বা যদি git diff --stat HEAD
আপত্তিহীন

1
এছাড়াও, আপনি ব্যবহার করে মাত্র পিতা বা মাতা চেয়ে আরও ফিরে তুলনা করতে পারবেন HEAD~n, যেখানে nআপনি কতদূর ফিরে যেতে চাই। git diff --stat HEAD~5 HEADহেডের সাথে সম্পর্কিত 5 টি কমিটের জন্য সম্মিলিত পরিসংখ্যান প্রদর্শন করবে will
নাথান বেক

18

ধরে নিই যে আপনি আপনার সমস্ত চুক্তির সাথে abcd123 (প্রথম প্রতিশ্রুতি) এবং wxyz789 (শেষ প্রতিশ্রুতি) এর মধ্যে তুলনা করতে চান:

git log wxyz789^..abcd123 --oneline --shortstat --author="Mike Surname"

এটি সুসংগত আউটপুট দেয় যেমন:

abcd123 Made things better
 3 files changed, 14 insertions(+), 159 deletions(-)
wxyz789 Made things more betterer
 26 files changed, 53 insertions(+), 58 deletions(-)

এর আউটপুট আমার পক্ষে কিছুই নয় (আমি কমিট করেছি এবং যাচাই করেছি - লেখক গিট লগ এবং অন্য কোনও যুক্তি দিয়ে এটি সঠিক)।
মাইক

এইটা আমার সাথে ঘটেছে. দুটি কমিট ভুল অর্ডারে ছিল, এগুলি চারপাশে অদলবদল করে ফিক্স করা হয়েছে।
বব এস্পোঞ্জ

1
প্রতিশ্রুতিবদ্ধ আদেশটি আপডেট করে এবং দুটি এসএইচএ কী প্রতিনিধিত্ব করে তা পরিষ্কার করে। এটি ধরার জন্য ধন্যবাদ :)
রন ডিভেরা

3
--shortstatপতাকা সন্ত্রস্ত, এটা সঙ্গে কাজ করে git diffযদিও (না git log)।
lucke84

কিভাবে তাদের সংক্ষিপ্তসার?
xpto

13

একটি নির্দিষ্ট সময়ের মধ্যে সমস্ত পরিবর্তন লগ পাওয়ার অন্য উপায়

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10"

আউটপুট:

2637cc736 Revert changed code
 1 file changed, 5 insertions(+), 5 deletions(-)
ba8d29402 Fix review
 2 files changed, 4 insertions(+), 11 deletions(-)

দীর্ঘ আউটপুট সামগ্রী সহ, আপনি আরও পঠনযোগ্য ফাইলের জন্য রফতানি করতে পারেন

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10" > /mnt/MyChangeLog.txt

2

যদিও উপরের সমস্ত উত্তর সঠিক, নীচের একটিকে ব্যবহার করতে সহজ যদি আপনার শেষের অনেকগুলি কমিটের গণনা প্রয়োজন

একের নীচে সর্বশেষ 5 টি কমিটের গণনা করা

git diff $(git log -5 --pretty=format:"%h" | tail -1) --shortstat

সর্বশেষ 10 টি কমিটের গণনা পেতে

git diff $(git log -10 --pretty=format:"%h" | tail -1) --shortstat

জেনেরিক - আপনার প্রয়োজনীয় অনেকগুলি কমিটের গণনা সহ এন পরিবর্তন করুন

git diff $(git log -N --pretty=format:"%h" | tail -1) --shortstat

শুরু থেকে সমস্ত কমিটের গণনা পেতে

git diff $(git log --pretty=format:"%h" | tail -1) --shortstat


এটি দেয় "'লেজ' কোনও অভ্যন্তরীণ বা বাহ্যিক কমান্ড, অপারেবল প্রোগ্রাম বা ব্যাচ ফাইল হিসাবে স্বীকৃত নয়।"
চার্লস রডি


1

আমি এই সমস্যাটি কেবল নিজের জন্যই সমাধান করেছি, তাই আমি যা এসেছি তা ভাগ করে নেব। এখানে শেষ ফলাফল:

> git summary --since=yesterday
total: 114 file changes, 13800 insertions(+) 638 deletions(-)

অন্তর্নিহিত কমান্ডটি এর মতো দেখাচ্ছে:

git log --numstat --format="" "$@" | awk '{files += 1}{ins += $1}{del += $2} END{print "total: "files" files, "ins" insertions(+) "del" deletions(-)"}'

$@আপনার যুক্তি যেমন --author="Brian"বা হিসাবে পাস করার জন্য লগ কমান্ডে নোট করুন --since=yesterday

এটিকে গিট ওরফে রাখার জন্য দৌড়াদৌড়ি থেকে বেরিয়ে আসা অবাস্তব ছিল, সুতরাং পরিবর্তে, আমি এটিকে আমার পথের ( ~/bin/git-stat-sum)) এর মধ্যে একটি এক্সিকিউটেবল স্ক্রিপ্টে রেখেছিলাম , তারপরে আমারটিতে উক্ত স্ক্রিপ্টটি ব্যবহার করলাম .gitconfig:

[alias]
    summary = !git-stat-sum \"$@\"

এবং এটি সত্যিই ভাল কাজ করে। একটি সর্বশেষ বিষয় লক্ষণীয় তা file changesহ'ল ফাইলগুলিতে পরিবর্তনের সংখ্যা, অনন্য ফাইলের সংখ্যা পরিবর্তিত হয়নি। এটাই আমি খুঁজছিলাম, তবে আপনি যা প্রত্যাশা করেছিলেন তা তা নাও হতে পারে।

এখানে আরও দুটি উদাহরণ রয়েছে

git summary --author=brian
git summary master..dev
# combine them as you like
git summary --author=brian master..dev
git summary --all

সত্যিই, আপনার কোনও git logকমান্ডের সাথে প্রতিস্থাপন করতে সক্ষম হওয়া উচিত git summary

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