উত্তর:
নিচের কমান্ডটির আউটপুট মোট যোগ করতে স্ক্রিপ্টে প্রেরণে যুক্তিসঙ্গতভাবে সহজ হওয়া উচিত:
git log --author="<authorname>" --oneline --shortstat
এটি বর্তমান হেডে সমস্ত কমিটির পরিসংখ্যান দেয়। আপনি যদি অন্য শাখায় পরিসংখ্যান যুক্ত করতে চান তবে আপনাকে সেগুলি যুক্তি হিসাবে সরবরাহ করতে হবে git log
।
কোনও স্ক্রিপ্টে যাওয়ার জন্য, এমনকি "অনলাইনলাইন" ফর্ম্যাট অপসারণ করা খালি লগ বিন্যাসের সাহায্যে করা যেতে পারে, এবং জাকুব নারাবস্কির মন্তব্য অনুসারে, --numstat
এটি অন্য বিকল্প। এটি প্রতি-লাইন পরিসংখ্যানের চেয়ে প্রতি-ফাইল উত্পন্ন করে তবে পার্স করা আরও সহজ।
git log --author="<authorname>" --pretty=tformat: --numstat
--numstat
পরিবর্তে ব্যবহার করতে পারেন --shortstat
।
git help log
রে আমাকে বলে যে প্রথম লাইন যুক্ত হয়, দ্বিতীয় লাইন মুছে ফেলা হয়।
এটি লেখক সম্পর্কে কিছু পরিসংখ্যান দেয়, প্রয়োজন অনুসারে পরিবর্তন করুন।
গাওক ব্যবহার:
git log --author="_Your_Name_Here_" --pretty=tformat: --numstat \
| gawk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s removed lines: %s total lines: %s\n", add, subs, loc }' -
ম্যাক ওএসএক্সে অ্যাওক ব্যবহার করা:
git log --author="_Your_Name_Here_" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -
গিথুব এ একটি নতুন প্যাকেজ রয়েছে যা চতুর দেখায় এবং ব্যাশ নির্ভরতা হিসাবে ব্যবহার করে (লিনাক্সের উপর পরীক্ষিত)। এটি স্ক্রিপ্টগুলির চেয়ে সরাসরি ব্যবহারের জন্য আরও উপযুক্ত।
এটি গিট-কুইক-স্ট্যাটাস (গিথুব লিঙ্ক) ।
git-quick-stats
একটি ফোল্ডারে অনুলিপি করুন এবং ফোল্ডারটিকে পথে যুক্ত করুন।
mkdir ~/source
cd ~/source
git clone git@github.com:arzzen/git-quick-stats.git
mkdir ~/bin
ln -s ~/source/git-quick-stats/git-quick-stats ~/bin/git-quick-stats
chmod +x ~/bin/git-quick-stats
export PATH=${PATH}:~/bin
ব্যবহার:
git-quick-stats
gawk
করতে awk
হয়েছিল
git clone https://github.com/arzzen/git-quick-stats.git
যদি কেউ তাদের কোডবেসে প্রতিটি ব্যবহারকারীর পরিসংখ্যান দেখতে চায় তবে আমার সহকর্মী দু'জন সম্প্রতি এই ভয়াবহ ওয়ান-লাইনার নিয়ে এসেছেন:
git log --shortstat --pretty="%cE" | sed 's/\(.*\)@.*/\1/' | grep -v "^$" | awk 'BEGIN { line=""; } !/^ / { if (line=="" || !match(line, $0)) {line = $0 "," line }} /^ / { print line " # " $0; line=""}' | sort | sed -E 's/# //;s/ files? changed,//;s/([0-9]+) ([0-9]+ deletion)/\1 0 insertions\(+\), \2/;s/\(\+\)$/\(\+\), 0 deletions\(-\)/;s/insertions?\(\+\), //;s/ deletions?\(-\)//' | awk 'BEGIN {name=""; files=0; insertions=0; deletions=0;} {if ($1 != name && name != "") { print name ": " files " files changed, " insertions " insertions(+), " deletions " deletions(-), " insertions-deletions " net"; files=0; insertions=0; deletions=0; name=$1; } name=$1; files+=$2; insertions+=$3; deletions+=$4} END {print name ": " files " files changed, " insertions " insertions(+), " deletions " deletions(-), " insertions-deletions " net";}'
(আমাদের রেপোতে ক্র্যাঞ্চ করতে কয়েক মিনিট সময় নেয়, যার প্রায় 10-15k কমিট থাকে))
michael,: 6057 files changed, 854902 insertions(+), 26973 deletions(-), 827929 net
গীত খ্যাতি https://github.com/oleender/git-fame-rb
কমিট এবং সংশোধিত ফাইল গণনা সহ একযোগে সমস্ত লেখকের জন্য গণনা পাওয়ার জন্য একটি দুর্দান্ত সরঞ্জাম:
sudo apt-get install ruby-dev
sudo gem install git_fame
cd /path/to/gitdir && git fame
Https://github.com/casperdcl/git-fame (@ ফ্র্যাক দ্বারা উল্লিখিত) তে পাইথন সংস্করণও রয়েছে :
sudo apt-get install python-pip python-dev build-essential
pip install --user git-fame
cd /path/to/gitdir && git fame
নমুনা আউটপুট:
Total number of files: 2,053
Total number of lines: 63,132
Total number of commits: 4,330
+------------------------+--------+---------+-------+--------------------+
| name | loc | commits | files | percent |
+------------------------+--------+---------+-------+--------------------+
| Johan Sørensen | 22,272 | 1,814 | 414 | 35.3 / 41.9 / 20.2 |
| Marius Mathiesen | 10,387 | 502 | 229 | 16.5 / 11.6 / 11.2 |
| Jesper Josefsson | 9,689 | 519 | 191 | 15.3 / 12.0 / 9.3 |
| Ole Martin Kristiansen | 6,632 | 24 | 60 | 10.5 / 0.6 / 2.9 |
| Linus Oleander | 5,769 | 705 | 277 | 9.1 / 16.3 / 13.5 |
| Fabio Akita | 2,122 | 24 | 60 | 3.4 / 0.6 / 2.9 |
| August Lilleaas | 1,572 | 123 | 63 | 2.5 / 2.8 / 3.1 |
| David A. Cuadrado | 731 | 111 | 35 | 1.2 / 2.6 / 1.7 |
| Jonas Ängeslevä | 705 | 148 | 51 | 1.1 / 3.4 / 2.5 |
| Diego Algorta | 650 | 6 | 5 | 1.0 / 0.1 / 0.2 |
| Arash Rouhani | 629 | 95 | 31 | 1.0 / 2.2 / 1.5 |
| Sofia Larsson | 595 | 70 | 77 | 0.9 / 1.6 / 3.8 |
| Tor Arne Vestbø | 527 | 51 | 97 | 0.8 / 1.2 / 4.7 |
| spontus | 339 | 18 | 42 | 0.5 / 0.4 / 2.0 |
| Pontus | 225 | 49 | 34 | 0.4 / 1.1 / 1.7 |
+------------------------+--------+---------+-------+--------------------+
তবে সতর্কতা অবলম্বন করুন: মন্তব্যে জ্যারেড যেমন উল্লেখ করেছেন, এটি খুব বড় সংগ্রহস্থলে করতে কয়েক ঘন্টা সময় লাগবে। এটি এত উন্নত হতে পারে কিনা তা নিশ্চিত নন, এটি এত পরিমাণ গিট ডেটা প্রক্রিয়া করা উচিত considering
git fame --branch=dev --timeout=-1 --exclude=Pods/*
নিম্নলিখিতটি বর্তমানে কোড বেসে সর্বাধিক রেখাগুলি ছিল তা দেখতে আমি দরকারী বলে মনে করেছি:
git ls-files -z | xargs -0n1 git blame -w | ruby -n -e '$_ =~ /^.*\((.*?)\s[\d]{4}/; puts $1.strip' | sort -f | uniq -c | sort -n
অন্যান্য উত্তরগুলি বেশিরভাগই কমিটগুলিতে পরিবর্তিত লাইনের দিকে দৃষ্টি নিবদ্ধ করে, তবে যদি কমিটগুলি বেঁচে না থাকে এবং ওভাররাইট করা হয় তবে সেগুলি সম্ভবত মন্থর হয়ে উঠেছে। উপরের উত্কর্ষটি আপনাকে সমস্ত প্রতিশ্রুতিবদ্ধদের একসাথে কেবলমাত্র একটির পরিবর্তে লাইন অনুসারে বাছাই করে। ফাইলকে কিছুটা আরও ভাল নম্বর পেতে ফাইল-গ্লোবাল (লিমিটেড-সি-এম) -র জন্য কিছু বিকল্প যুক্ত করতে পারেন যা ফাইলগুলির মধ্যে ফাইলের চলাচল এবং লাইন চলাচল করে, তবে আপনি যদি কমান্ডটি আরও বেশি দিন চালাতে পারেন তবে longer
এছাড়াও, যদি আপনি সমস্ত প্রতিশ্রুতিবদ্ধদের জন্য সমস্ত চুক্তিতে পরিবর্তিত রেখাগুলি সন্ধান করে থাকেন তবে নীচের লিখিত লিপিটি সহায়ক:
/^.*\((.*?)\s[\d]{4}/
/^.*?\((.*?)\s[\d]{4}/
উত্স মধ্যে একটি লেখক হিসাবে ম্যাচিং বন্ধনী প্রতিরোধ করা উচিত ।
সংখ্যা গণনা করার জন্য করে একটি প্রদত্ত শাখা আপনি ব্যবহার করতে পারেন একটি নির্দিষ্ট লেখক (অথবা সমস্ত লেখক) দ্বারা Git-shortlog ; বিশেষত এর --numbered
এবং --summary
বিকল্পগুলি দেখুন, উদাহরণস্বরূপ যখন গিট সংগ্রহস্থলটিতে চালানো হয়:
$ git shortlog v1.6.4 --numbered --summary
6904 Junio C Hamano
1320 Shawn O. Pearce
1065 Linus Torvalds
692 Johannes Schindelin
443 Eric Wong
v1.6.4
এই উদাহরণটিতে আউটপুট নির্ধারণকারী করতে এখানে: আপনি যখন ক্লোন এবং / অথবা গিট সংগ্রহস্থল থেকে আনেন তখন তা একই রকম হবে।
v1.6.4
আমাকে দেয়:fatal: ambiguous argument 'v1.6.4': unknown revision or path not in the working tree.
git shortlog -sne
অথবা, আপনি যদি মার্জগুলিকে অন্তর্ভুক্ত না করেনgit shortlog -sne --no-merges
-s
হয় --summary
, -n
হয় --numbered
, এবং [নতুন] -e
হয় --email
লেখক ইমেল দেখানোর জন্য (এবং আলাদাভাবে আলাদা ইমেল ঠিকানা দিয়ে একই লেখক গণনা একাউন্টে গ্রহণ .mailmap
সংশোধন)। সম্পর্কে ভাল কল --no-merges
।
দেখার পরও কি Alex এর এবং Gerty3000 এর উত্তর, আমি এক-লাইনের কমান চেষ্টা করেছি:
মূলত, গিট লগ নম্বস্ট্যাট ব্যবহার করা এবং ফাইলগুলির সংখ্যা ট্র্যাক না করা পরিবর্তন করা ।
ম্যাক ওএসএক্স-এ গিট সংস্করণ ২.১.০:
git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done
উদাহরণ:
Jared Burrows added lines: 6826, removed lines: 2825, total lines: 4001
উত্তর থেকে AaronM শেল এক-লাইনের ব্যবহার ভাল, কিন্তু আসলে সেখানে এখনও অন্য বাগ সংশোধন করা হয়, যেখানে স্পেস হবে দুর্নীতিগ্রস্ত ব্যবহারকারীর নাম যদি ব্যবহারকারী নাম এবং তারিখের মধ্যে সাদা স্পেস বিভিন্ন পরিমাণে আছে। দূষিত ব্যবহারকারীর নামগুলি ব্যবহারকারীর গণনাগুলির জন্য একাধিক সারি দেবে এবং আপনাকে সেগুলি নিজেই যোগ করতে হবে।
এই ছোট্ট পরিবর্তনটি আমার জন্য সমস্যাটি স্থির করে:
git ls-files -z | xargs -0n1 git blame -w --show-email | perl -n -e '/^.*?\((.*?)\s+[\d]{4}/; print $1,"\n"' | sort -f | uniq -c | sort -n
+ পরে Notice গুলি লক্ষ্য করুন যা নাম থেকে শুরু করে তারিখ পর্যন্ত সমস্ত শ্বেতক্ষেত্র গ্রাস করবে।
আসলে এই উত্তরটি আমার নিজের স্মরণে রাখার জন্য যত বেশি অন্য কাউকে সাহায্য করার জন্য যুক্ত করা, যেহেতু আমি অন্তত দ্বিতীয় বার বিষয়টি গুগল করছি :)
--show-email
করার git blame -w
জন্য যুক্ত করা হয়েছে, যেহেতু কিছু লোক Name
বিভিন্ন কম্পিউটারে বিভিন্ন ফর্ম্যাট ব্যবহার করে এবং কখনও কখনও একই নামের দুটি ব্যক্তি একই গিটে কাজ করে।unsupported file type
তবে অন্যথায় এটি তাদের সাথে ঠিক ঠিক কাজ করে বলে মনে হয় (এটি এড়িয়ে যায়)।
এখানে একটি সংক্ষিপ্ত ওয়ান-লাইনার যা সমস্ত লেখকের জন্য পরিসংখ্যান তৈরি করে। এটি উপরের https://stackoverflow.com/a/20414465/1102119 এ ড্যানের সমাধানের চেয়ে অনেক দ্রুত (খনিতে ও (এনএম) এর পরিবর্তে টাইম জটিলতা ও (এন) রয়েছে যেখানে এন কমিটের সংখ্যা এবং এম লেখকের সংখ্যা )।
git log --no-merges --pretty=format:%an --numstat | awk '/./ && !author { author = $0; next } author { ins[author] += $1; del[author] += $2 } /^$/ { author = ""; next } END { for (a in ins) { printf "%10d %10d %10d %s\n", ins[a] - del[a], ins[a], del[a], a } }' | sort -rn
--no-show-signature
, অন্যথায় লোকেরা যারা তাদের পিজিপি-সাইন দিয়ে তাদের প্রতিশ্রুতিগুলি গণনা করা হচ্ছে না।
count-lines = "!f() { git log --no-merges --pretty=format:%an --numstat | awk '/./ && !author { author = $0; next } author { ins[author] += $1; del[author] += $2 } /^$/ { author = \"\"; next } END { for (a in ins) { printf \"%10d %10d %10d %s\\n\", ins[a] - del[a], ins[a], del[a], a } }' | sort -rn; }; f"
। (দ্রষ্টব্য আমি উইন্ডোজে আছি; আপনার বিভিন্ন ধরণের উদ্ধৃতি ব্যবহারের প্রয়োজন হতে পারে)
@ মাইমোবিনস @ অ্যারোনম @ এরিকজেড @ জেমসমিশ্রা এমন রূপগুলি সরবরাহ করেছেন যা সকলের মধ্যে একটিরকম সমস্যা রয়েছে: তারা গিটকে অনুরূপ তথ্যের মিশ্রণ উত্পাদন করতে অনুরোধ করে, একই লাইনে সংগ্রহস্থল থেকে লাইন বিষয়বস্তু সহ, আবার একটি রেজিপ এক্সের সাথে মেসটি মিলবে ।
যখন কিছু লাইন বৈধ ইউটিএফ -8 পাঠ্যটি বৈধ নয় এবং যখন কিছু লাইনগুলি রেজিএক্সএক্সের সাথে মেলে (এটি এখানে ঘটেছিল) তখন এটি একটি সমস্যা।
এখানে এমন একটি পরিবর্তিত রেখা রয়েছে যাতে এই সমস্যাগুলি নেই। এটি আলাদা লাইনগুলিতে পরিষ্কারভাবে আউটপুট ডেটে গিটকে অনুরোধ করে, যা আমাদের দৃ what়তার সাথে ফিল্টার করা সহজ করে তোলে:
git ls-files -z | xargs -0n1 git blame -w --line-porcelain | grep -a "^author " | sort -f | uniq -c | sort -n
আপনি অন্যান্য স্ট্রিং, যেমন লেখক-মেল, প্রতিশ্রুতিবদ্ধ ইত্যাদির জন্য গ্রেপ করতে পারেন
বাইট-লেভেল প্রসেসিংকে বাধ্য করার জন্য সম্ভবত প্রথমে export LC_ALL=C
(অনুমান করে bash
) করুন ( এটি ইউটিএফ -8-ভিত্তিক লোকেলগুলি থেকে গ্রেপটি প্রচন্ডভাবে গতিতে ঘটবে)।
মাঝখানে রুবি দিয়ে একটি সমাধান দেওয়া হয়েছিল, পারলটি এখানে ডিফল্টরূপে আরও কিছুটা সহজলভ্য হওয়ায় লেখকের বর্তমান লাইনের জন্য পার্ল ব্যবহার করার বিকল্প।
git ls-files -z | xargs -0n1 git blame -w | perl -n -e '/^.*\((.*?)\s*[\d]{4}/; print $1,"\n"' | sort -f | uniq -c | sort -n
চার্লস বেইলের উত্তর ছাড়াও , আপনি -C
কমান্ডগুলিতে প্যারামিটার যুক্ত করতে চাইতে পারেন । অন্যথায় ফাইলের নামগুলি প্রচুর সংখ্যক সংযোজন এবং অপসারণ হিসাবে গণনা করে (যতগুলি ফাইলের লাইন থাকে) এমনকি ফাইলের সামগ্রী পরিবর্তন না করা হলেও।
উদাহরণ হিসেবে বলা যায়, এখানে একটি কমিট ফাইল প্রচুর আমার প্রকল্প, যখন ব্যবহার এক থেকে প্রায় সরানো হচ্ছে git log --oneline --shortstat
কমান্ড প্রয়োগ করুন:
9052459 Reorganized project structure
43 files changed, 1049 insertions(+), 1000 deletions(-)
এবং এখানে একই git log --oneline --shortstat -C
কমান্ডটি ব্যবহার করে যা ফাইল অনুলিপি এবং পুনরায় নাম সনাক্ত করে:
9052459 Reorganized project structure
27 files changed, 134 insertions(+), 85 deletions(-)
আমার মতে এই প্রকল্পটির উপর কোনও ব্যক্তি কতটা প্রভাব ফেলেছে তার উত্তরোত্তর আরও বাস্তবসম্মত দৃষ্টিভঙ্গি দেয় কারণ একটি ফাইলের নাম পরিবর্তন করা ফাইলটি স্ক্র্যাচ থেকে লেখার চেয়ে অনেক ছোট অপারেশন।
আপনি হুডিড ব্যবহার করতে পারেন ( https://www.npmjs.com/package/ whodid )
$ npm install whodid -g
$ cd your-project-dir
এবং
$ whodid author --include-merge=false --path=./ --valid-threshold=1000 --since=1.week
বা শুধু টাইপ করুন
$ whodid
তাহলে আপনি এর মতো ফলাফল দেখতে পাবেন
Contribution state
=====================================================
score | author
-----------------------------------------------------
3059 | someguy <someguy@tensorflow.org>
585 | somelady <somelady@tensorflow.org>
212 | niceguy <nice@google.com>
173 | coolguy <coolgay@google.com>
=====================================================
-g
প্যাকেজ নাম আগে আসতে হবে macOS
। সহজভাবে সাহায্য করার চেষ্টা করা।
এখানে একটি তাত্ক্ষণিক রুবি স্ক্রিপ্ট যা প্রদত্ত লগ ক্যোয়ারির বিপরীতে ব্যবহারকারীর প্রতি প্রভাবকে ছাঁটাই করে।
উদাহরণস্বরূপ, রুবিনিয়াসের জন্য :
Brian Ford: 4410668
Evan Phoenix: 1906343
Ryan Davis: 855674
Shane Becker: 242904
Alexander Kellett: 167600
Eric Hodel: 132986
Dirkjan Bussink: 113756
...
এই পান্ডুলিপি:
#!/usr/bin/env ruby
impact = Hash.new(0)
IO.popen("git log --pretty=format:\"%an\" --shortstat #{ARGV.join(' ')}") do |f|
prev_line = ''
while line = f.gets
changes = /(\d+) insertions.*(\d+) deletions/.match(line)
if changes
impact[prev_line] += changes[1].to_i + changes[2].to_i
end
prev_line = line # Names are on a line of their own, just before the stats
end
end
impact.sort_by { |a,i| -i }.each do |author, impact|
puts "#{author.strip}: #{impact}"
end
এটি সেরা উপায় এবং এটি আপনাকে সমস্ত ব্যবহারকারীর দ্বারা কমিটের সংখ্যার একটি পরিষ্কার চিত্র দেয়
git shortlog -s -n
আমি উপরে একটি সংক্ষিপ্ত উত্তরের একটি সংশোধন সরবরাহ করেছি, তবে এটি আমার প্রয়োজনের জন্য যথেষ্ট নয়। আমার চূড়ান্ত কোডে প্রতিশ্রুতিবদ্ধ রেখা এবং রেখা উভয়কেই শ্রেণিবদ্ধ করতে সক্ষম হওয়া দরকার। আমি ফাইল দ্বারা একটি ব্রেক ডাউন চেয়েছিলেন। এই কোডটি পুনরাবৃত্তি করে না, এটি কেবলমাত্র একক ডিরেক্টরিতে ফলাফলগুলি ফিরিয়ে দেবে, তবে কেউ আরও এগিয়ে যেতে চাইলে এটি একটি ভাল শুরু। একটি ফাইল অনুলিপি করুন এবং আটকান এবং কার্যকর করতে পারেন বা পার্ল দিয়ে এটি চালান।
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $dir = shift;
die "Please provide a directory name to check\n"
unless $dir;
chdir $dir
or die "Failed to enter the specified directory '$dir': $!\n";
if ( ! open(GIT_LS,'-|','git ls-files') ) {
die "Failed to process 'git ls-files': $!\n";
}
my %stats;
while (my $file = <GIT_LS>) {
chomp $file;
if ( ! open(GIT_LOG,'-|',"git log --numstat $file") ) {
die "Failed to process 'git log --numstat $file': $!\n";
}
my $author;
while (my $log_line = <GIT_LOG>) {
if ( $log_line =~ m{^Author:\s*([^<]*?)\s*<([^>]*)>} ) {
$author = lc($1);
}
elsif ( $log_line =~ m{^(\d+)\s+(\d+)\s+(.*)} ) {
my $added = $1;
my $removed = $2;
my $file = $3;
$stats{total}{by_author}{$author}{added} += $added;
$stats{total}{by_author}{$author}{removed} += $removed;
$stats{total}{by_author}{total}{added} += $added;
$stats{total}{by_author}{total}{removed} += $removed;
$stats{total}{by_file}{$file}{$author}{added} += $added;
$stats{total}{by_file}{$file}{$author}{removed} += $removed;
$stats{total}{by_file}{$file}{total}{added} += $added;
$stats{total}{by_file}{$file}{total}{removed} += $removed;
}
}
close GIT_LOG;
if ( ! open(GIT_BLAME,'-|',"git blame -w $file") ) {
die "Failed to process 'git blame -w $file': $!\n";
}
while (my $log_line = <GIT_BLAME>) {
if ( $log_line =~ m{\((.*?)\s+\d{4}} ) {
my $author = $1;
$stats{final}{by_author}{$author} ++;
$stats{final}{by_file}{$file}{$author}++;
$stats{final}{by_author}{total} ++;
$stats{final}{by_file}{$file}{total} ++;
$stats{final}{by_file}{$file}{total} ++;
}
}
close GIT_BLAME;
}
close GIT_LS;
print "Total lines committed by author by file\n";
printf "%25s %25s %8s %8s %9s\n",'file','author','added','removed','pct add';
foreach my $file (sort keys %{$stats{total}{by_file}}) {
printf "%25s %4.0f%%\n",$file
,100*$stats{total}{by_file}{$file}{total}{added}/$stats{total}{by_author}{total}{added};
foreach my $author (sort keys %{$stats{total}{by_file}{$file}}) {
next if $author eq 'total';
if ( $stats{total}{by_file}{$file}{total}{added} ) {
printf "%25s %25s %8d %8d %8.0f%%\n",'', $author,@{$stats{total}{by_file}{$file}{$author}}{qw{added removed}}
,100*$stats{total}{by_file}{$file}{$author}{added}/$stats{total}{by_file}{$file}{total}{added};
} else {
printf "%25s %25s %8d %8d\n",'', $author,@{$stats{total}{by_file}{$file}{$author}}{qw{added removed}} ;
}
}
}
print "\n";
print "Total lines in the final project by author by file\n";
printf "%25s %25s %8s %9s %9s\n",'file','author','final','percent', '% of all';
foreach my $file (sort keys %{$stats{final}{by_file}}) {
printf "%25s %4.0f%%\n",$file
,100*$stats{final}{by_file}{$file}{total}/$stats{final}{by_author}{total};
foreach my $author (sort keys %{$stats{final}{by_file}{$file}}) {
next if $author eq 'total';
printf "%25s %25s %8d %8.0f%% %8.0f%%\n",'', $author,$stats{final}{by_file}{$file}{$author}
,100*$stats{final}{by_file}{$file}{$author}/$stats{final}{by_file}{$file}{total}
,100*$stats{final}{by_file}{$file}{$author}/$stats{final}{by_author}{total}
;
}
}
print "\n";
print "Total lines committed by author\n";
printf "%25s %8s %8s %9s\n",'author','added','removed','pct add';
foreach my $author (sort keys %{$stats{total}{by_author}}) {
next if $author eq 'total';
printf "%25s %8d %8d %8.0f%%\n",$author,@{$stats{total}{by_author}{$author}}{qw{added removed}}
,100*$stats{total}{by_author}{$author}{added}/$stats{total}{by_author}{total}{added};
};
print "\n";
print "Total lines in the final project by author\n";
printf "%25s %8s %9s\n",'author','final','percent';
foreach my $author (sort keys %{$stats{final}{by_author}}) {
printf "%25s %8d %8.0f%%\n",$author,$stats{final}{by_author}{$author}
,100*$stats{final}{by_author}{$author}/$stats{final}{by_author}{total};
}
উইন্ডোজ ব্যবহারকারীদের জন্য আপনি নিম্নলিখিত ব্যাচের স্ক্রিপ্ট ব্যবহার করতে পারেন যা নির্দিষ্ট লেখকের জন্য যুক্ত / সরানো রেখাগুলি গণনা করে
@echo off
set added=0
set removed=0
for /f "tokens=1-3 delims= " %%A in ('git log --pretty^=tformat: --numstat --author^=%1') do call :Count %%A %%B %%C
@echo added=%added%
@echo removed=%removed%
goto :eof
:Count
if NOT "%1" == "-" set /a added=%added% + %1
if NOT "%2" == "-" set /a removed=%removed% + %2
goto :eof
https://gist.github.com/zVolodymyr/62e78a744d99d414d56646a5e8a1ff4f
git-quick-stats
brew install git-quick-stats
git-quick-stats
তালিকাভুক্ত নম্বর টাইপ করে এন্টারটি চাপিয়ে এই তালিকা থেকে আপনি কোন বিকল্পটি চান তা চয়ন করুন।
Generate:
1) Contribution stats (by author)
2) Contribution stats (by author) on a specific branch
3) Git changelogs (last 10 days)
4) Git changelogs by author
5) My daily status
6) Save git log output in JSON format
List:
7) Branch tree view (last 10)
8) All branches (sorted by most recent commit)
9) All contributors (sorted by name)
10) Git commits per author
11) Git commits per date
12) Git commits per month
13) Git commits per weekday
14) Git commits per hour
15) Git commits by author per hour
Suggest:
16) Code reviewers (based on git history)
এখানে এই স্ক্রিপ্ট এটি করবে। এটিকে authorship.sh, chmod + x এ রাখুন এবং আপনি সম্পূর্ণ প্রস্তুত।
#!/bin/sh
declare -A map
while read line; do
if grep "^[a-zA-Z]" <<< "$line" > /dev/null; then
current="$line"
if [ -z "${map[$current]}" ]; then
map[$current]=0
fi
elif grep "^[0-9]" <<<"$line" >/dev/null; then
for i in $(cut -f 1,2 <<< "$line"); do
map[$current]=$((map[$current] + $i))
done
fi
done <<< "$(git log --numstat --pretty="%aN")"
for i in "${!map[@]}"; do
echo -e "$i:${map[$i]}"
done | sort -nr -t ":" -k 2 | column -t -s ":"
আপনার লগগুলি ফাইলটিতে সংরক্ষণ করে:
git log --author="<authorname>" --oneline --shortstat > logs.txt
পাইথন প্রেমীদের জন্য:
with open(r".\logs.txt", "r", encoding="utf8") as f:
files = insertions = deletions = 0
for line in f:
if ' changed' in line:
line = line.strip()
spl = line.split(', ')
if len(spl) > 0:
files += int(spl[0].split(' ')[0])
if len(spl) > 1:
insertions += int(spl[1].split(' ')[0])
if len(spl) > 2:
deletions += int(spl[2].split(' ')[0])
print(str(files).ljust(10) + ' files changed')
print(str(insertions).ljust(10) + ' insertions')
print(str(deletions).ljust(10) + ' deletions')
আপনার ফলাফলগুলি হবে:
225 files changed
6751 insertions
1379 deletions
আপনি গিট দোষ চান ।
কিছু, ভাল, পরিসংখ্যান মুদ্রণের জন্য একটি - শো-পরিসংখ্যান বিকল্প রয়েছে option
blame
, কিন্তু এটি ওপটির দরকার হবে বলে আমি ভেবেছিলাম এমন পরিসংখ্যান সত্যিই দেয় নি?
প্রশ্নটি কোনও নির্দিষ্ট লেখকের কাছে তথ্যের জন্য জিজ্ঞাসা করেছিল , তবে উত্তরগুলির অনেকগুলি সমাধান ছিল যা তাদের কোডের লাইনের ভিত্তিতে লেখকের তালিকাভুক্ত তালিকা পরিবর্তন করেছিল।
এটি আমি যা খুঁজছিলাম, কিন্তু বিদ্যমান সমাধানগুলি বেশ নিখুঁত ছিল না। গুগলের মাধ্যমে এই প্রশ্নটি খুঁজে পেতে পারে এমন লোকদের স্বার্থে, আমি তাদের উপর কিছু উন্নতি করেছি এবং সেগুলি শেল স্ক্রিপ্টে পরিণত করেছি, যা আমি নীচে প্রদর্শন করি। একটি মন্তব্যযুক্ত (যা আমি বজায় রাখব) আমার গিথুবটিতে পাওয়া যাবে ।
আছে কোন পারেন পার্ল বা রুবি উপর নির্ভরতা। তদ্ব্যতীত, হোয়াইটস্পেস, নাম এবং লাইনের গতিবিধিগুলি লাইন পরিবর্তন গণনায় বিবেচনায় নেওয়া হয়। এটি কেবল একটি ফাইলের মধ্যে রাখুন এবং আপনার গিট সংগ্রহস্থলটিকে প্রথম প্যারামিটার হিসাবে পাস করুন।
#!/bin/bash
git --git-dir="$1/.git" log > /dev/null 2> /dev/null
if [ $? -eq 128 ]
then
echo "Not a git repository!"
exit 128
else
echo -e "Lines | Name\nChanged|"
git --work-tree="$1" --git-dir="$1/.git" ls-files -z |\
xargs -0n1 git --work-tree="$1" --git-dir="$1/.git" blame -C -M -w |\
cut -d'(' -f2 |\
cut -d2 -f1 |\
sed -e "s/ \{1,\}$//" |\
sort |\
uniq -c |\
sort -nr
fi
এখন পর্যন্ত আমি যে সেরা সরঞ্জামটি সনাক্ত করেছি তা হ'ল গিটিনস্পেক্টর। এটি প্রতি ব্যবহারকারীর জন্য প্রতি সপ্তাহে সেট প্রতিবেদন দেয় ইত্যাদি আপনি এনপিএম সহ নীচের মত ইনস্টল করতে পারেন
এনপিএম ইনস্টল -জি গিটিনস্পেক্টর
আরও বিশদ পেতে লিঙ্কগুলি
https://www.npmjs.com/package/gitinspector
https://github.com/ejwa/gitinspector/wiki/Documentation
https://github.com/ejwa/gitinspector
উদাহরণ কমান্ড হয়
gitinspector -lmrTw
gitinspector --since=1-1-2017 etc
আমি এই পার্ল স্ক্রিপ্ট লিখেছিলাম সেই কাজটি সম্পাদন করার জন্য।
#!/usr/bin/env perl
use strict;
use warnings;
# save the args to pass to the git log command
my $ARGS = join(' ', @ARGV);
#get the repo slug
my $NAME = _get_repo_slug();
#get list of authors
my @authors = _get_authors();
my ($projectFiles, $projectInsertions, $projectDeletions) = (0,0,0);
#for each author
foreach my $author (@authors) {
my $command = qq{git log $ARGS --author="$author" --oneline --shortstat --no-merges};
my ($files, $insertions, $deletions) = (0,0,0);
my @lines = `$command`;
foreach my $line (@lines) {
if ($line =~ m/^\s(\d+)\s\w+\s\w+,\s(\d+)\s\w+\([\+|\-]\),\s(\d+)\s\w+\([\+|\-]\)$|^\s(\d+)\s\w+\s\w+,\s(\d+)\s\w+\(([\+|\-])\)$/) {
my $lineFiles = $1 ? $1 : $4;
my $lineInsertions = (defined $6 && $6 eq '+') ? $5 : (defined $2) ? $2 : 0;
my $lineDeletions = (defined $6 && $6 eq '-') ? $5 : (defined $3) ? $3 : 0;
$files += $lineFiles;
$insertions += $lineInsertions;
$deletions += $lineDeletions;
$projectFiles += $lineFiles;
$projectInsertions += $lineInsertions;
$projectDeletions += $lineDeletions;
}
}
if ($files || $insertions || $deletions) {
printf(
"%s,%s,%s,+%s,-%s,%s\n",
$NAME,
$author,
$files,
$insertions,
$deletions,
$insertions - $deletions
);
}
}
printf(
"%s,%s,%s,+%s,-%s,%s\n",
$NAME,
'PROJECT_TOTAL',
$projectFiles,
$projectInsertions,
$projectDeletions,
$projectInsertions - $projectDeletions
);
exit 0;
#get the remote.origin.url joins that last two pieces (project and repo folder)
#and removes any .git from the results.
sub _get_repo_slug {
my $get_remote_url = "git config --get remote.origin.url";
my $remote_url = `$get_remote_url`;
chomp $remote_url;
my @parts = split('/', $remote_url);
my $slug = join('-', @parts[-2..-1]);
$slug =~ s/\.git//;
return $slug;
}
sub _get_authors {
my $git_authors = 'git shortlog -s | cut -c8-';
my @authors = `$git_authors`;
chomp @authors;
return @authors;
}
আমি এটা নামে git-line-changes-by-author
এবং পুরা /usr/local/bin
। কারণ এটি আমার পথে সংরক্ষণ করা হয়েছে, তাই আমি git line-changes-by-author --before 2018-12-31 --after 2020-01-01
2019 বছরের প্রতিবেদনটি পেতে আদেশটি জারি করতে পারি । উদাহরণ হিসাবে। এবং যদি আমি নামের ভুল বানান করি তবে গিটটি সঠিক বানানের পরামর্শ দেবে।
আপনি আমার _get_repo_slug
সাব- কে সামঞ্জস্য করতে চাইলে কেবলমাত্র remote.origin.url
আমার শেষ অংশটি যেমন অন্তর্ভুক্ত করা হয়েছে তেমন অন্তর্ভুক্ত করতে পারেন project/repo
এবং আপনার নাও হতে পারে।
git://git.lwn.net/gitdm.git
।