গিট ব্ল্যাম কমিট স্ট্যাটিস্টিক্স


198

প্রতিটি প্রতিশ্রুতিবদ্ধ থেকে সংগ্রহস্থলটিতে বর্তমানে কতগুলি রেখা (কোডের) রয়েছে তা সম্পর্কে একটি পরিসংখ্যান দেওয়ার জন্য আমি কীভাবে "অপব্যবহার" দোষ (বা কিছু ভাল উপযোগী ফাংশন, এবং / অথবা শেল কমান্ডের সাথে মিলিয়ে) দিতে পারি?

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

Committer 1: 8046 Lines
Committer 2: 4378 Lines

11
সত্যিই এর জন্য একটি অন্তর্নির্মিত কমান্ড থাকা উচিত ... খুব কম ব্যবহারের ক্ষেত্রে কমান্ড রয়েছে।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

@ সিরোস্যান্টিলি তবে গিট থেকে ডাকে এমন শেলসক্রিপ্ট যুক্ত করা সহজ।
অ্যালেক্স

গিট সংগ্রহস্থলের কোনও নির্দিষ্ট লেখকের দ্বারা পরিবর্তিত মোট রেখাগুলি গণনা করার সম্ভাব্য সদৃশ ? কারণ এটি সহজেই সেই একটিতে হ্রাস করা যেতে পারে: সমস্ত লেখকের উপরে কেবল লুপ করুন
সিওরো সান্তিলি 法轮功 冠状 病 六四 事件 法轮功

1
এটি বেশ বিস্ময়কর কোড. google.com/p/gitinspector বিশেষত যদি আপনি ছাত্রদের দল দ্বারা কার্যনির্বাহী গ্রেডিং করছেন (বড় প্রকল্পগুলি প্রয়োগ করার দরকার নেই ... এটি ধীরে ধীরে কারণ এটি প্রতিটি স্বতন্ত্র ফাইলকে দোষ দেয়)

উত্তর:


166

হালনাগাদ

git ls-tree -r -z --name-only HEAD -- */*.c | xargs -0 -n1 git blame \
--line-porcelain HEAD |grep  "^author "|sort|uniq -c|sort -nr

আমি পথে কিছু জিনিস আপডেট করেছি।

সুবিধার জন্য, আপনি এটিকে নিজের কমান্ডের মধ্যেও রাখতে পারেন:

#!/bin/bash

# save as i.e.: git-authors and set the executable flag
git ls-tree -r -z --name-only HEAD -- $1 | xargs -0 -n1 git blame \
 --line-porcelain HEAD |grep  "^author "|sort|uniq -c|sort -nr

এটি আপনার পথে কোথাও সংরক্ষণ করুন বা আপনার পথটি সংশোধন করুন এবং এটি পছন্দ করুন

  • git authors '*/*.c' # look for all files recursively ending in .c
  • git authors '*/*.[ch]' # look for all files recursively ending in .c or .h
  • git authors 'Makefile' # just count lines of authors in the Makefile

আসল উত্তর

স্বীকৃত উত্তরটি কাজটি করার সময় এটি খুব ধীর।

$ git ls-tree --name-only -z -r HEAD|egrep -z -Z -E '\.(cc|h|cpp|hpp|c|txt)$' \
  |xargs -0 -n1 git blame --line-porcelain|grep "^author "|sort|uniq -c|sort -nr

প্রায় তাত্ক্ষণিক।

বর্তমানে ট্র্যাক করা ফাইলগুলির একটি তালিকা পেতে আপনি ব্যবহার করতে পারেন

git ls-tree --name-only -r HEAD

এই সমাধানটি fileফাইল টাইপ নির্ধারণের জন্য কল করা এড়ায় এবং পারফরম্যান্সের কারণে পছন্দসই এক্সটেনশনের সাথে মিলে গ্রেপ ব্যবহার করে। যদি সমস্ত ফাইল অন্তর্ভুক্ত করা উচিত, কেবল এটিকে লাইন থেকে সরান।

grep -E '\.(cc|h|cpp|hpp|c)$' # for C/C++ files
grep -E '\.py$'               # for Python files

যদি ফাইলগুলিতে স্পেস থাকতে পারে তবে শেলগুলির জন্য খারাপ যা আপনি ব্যবহার করতে পারেন:

git ls-tree -z --name-only -r HEAD | egrep -Z -z '\.py'|xargs -0 ... # passes newlines as '\0'

ফাইলগুলির একটি তালিকা দিন (পাইপের মাধ্যমে) একটি কমান্ড কল করতে এবং যুক্তি বিতরণ করতে এক্সার্গস ব্যবহার করতে পারে। যে কমান্ড একাধিক ফাইল অনুমতি obmit প্রক্রিয়া হওয়ার -n1। এই ক্ষেত্রে আমরা কল করি git blame --line-porcelainএবং প্রতিটি কলের জন্য আমরা ঠিক 1 টি যুক্তি ব্যবহার করি।

xargs -n1 git blame --line-porcelain

এরপরে আমরা "লেখক" এর উপস্থিতিগুলির জন্য আউটপুট ফিল্টার করি তালিকাটি সাজান এবং নকল লাইনগুলি গণনা করে:

grep "^author "|sort|uniq -c|sort -nr

বিঃদ্রঃ

অন্যান্য উত্তরগুলি আসলে লাইনগুলি ফিল্টার করে যেগুলিতে কেবল শ্বেতস্থান থাকে।

grep -Pzo "author [^\n]*\n([^\n]*\n){10}[\w]*[^\w]"|grep "author "

উপরের কমান্ডটি কমপক্ষে একটি অ-হোয়াইটস্পেস অক্ষরযুক্ত লাইনের লেখককে মুদ্রণ করবে। আপনি \w*[^\w#]ম্যাচটিও ব্যবহার করতে পারেন যা লাইনগুলিও বাদ দেবে যেখানে প্রথম অ-সাদা অংশের অক্ষরটি নয় #(অনেকগুলি স্ক্রিপ্টিং ভাষায় মন্তব্য করুন)।


2
@ নীলবাস: আপনি পারবেন না। echo "a\nb\nc"|xargs -n1 cmdপ্রসারিত হবেcmd a; cmd b; cmd d
অ্যালেক্স

2
- লাইন-চীনামাটির কাজ আর কাজ করে না বলে মনে হচ্ছে (গিট 1.7.5.4) পরিবর্তে
পোরস্লেইন

4
ওএসএক্স ব্যবহারকারীগণ, নিম্নলিখিতটি চেষ্টা করুন (এখনও তাদের নামে নতুন লাইনের সাথে ফাইলগুলিতে কাজ করে না):git ls-tree --name-only -r HEAD | grep -E '\.(cc|h|m|hpp|c)$' | xargs -n1 git blame --line-porcelain | grep "^author "|sort|uniq -c|sort -nr
ওয়েইন

3
যদি আপনি কেবল চলমান পাথের নীচে সমস্ত কিছু চান, কোনও গভীরতার জন্য, "./ "টিকে প্যাথ ফিল্টার হিসাবে ব্যবহার করুন (যেখানে উত্তরদাতা" / .c " রেখেছেন )।
বেন দিল্টস 16

2
কোডটি কেবল পুনরায় ফর্ম্যাট করা হয়েছিল যখন স্ট্যাকওভারফ্লো.com
স্লিপলেসনার্ড

124

আমি গিট-ফেম নামে একটি রত্ন লিখেছি যা দরকারী হতে পারে।

ইনস্টলেশন ও ব্যবহার:

  1. $ gem install git_fame
  2. $ cd /path/to/gitdir
  3. $ git fame

আউটপুট:

Statistics based on master
Active files: 21
Active lines: 967
Total commits: 109

Note: Files matching MIME type image, binary has been ignored

+----------------+-----+---------+-------+---------------------+
| name           | loc | commits | files | distribution (%)    |
+----------------+-----+---------+-------+---------------------+
| Linus Oleander | 914 | 106     | 21    | 94.5 / 97.2 / 100.0 |
| f1yegor        | 47  | 2       | 7     |  4.9 /  1.8 / 33.3  |
| David Selassie | 6   | 1       | 2     |  0.6 /  0.9 /  9.5  |
+----------------+-----+---------+-------+---------------------+

5
+1 অবশেষে 1 যা কাজ করে এবং দেখে মনে হচ্ছে এটি বুদ্ধিমান সংখ্যা দেয়, বাকী কমান্ড লাইনগুলি হয় অসম্পূর্ণতার কারণে OSX এ কাজ করবে না বা আমার রেপোতে কিশোর সংখ্যা দেবে। এটি ওএসএক্স এবং রুবি ১.৯.৩ (সংযুক্তি)
কার্তিক টি

9
@ ক্যাসওয়েল, বোকা হবেন না। এটি দরকারী কিছুতে নির্দেশ করা স্প্যাম নয়, এমনকি যদি আপনি এমন কিছু লেখার মতো হয়ে থাকেন তবে।
ওয়েইন

5
আমার নিজের প্রশ্নের উত্তরে: গিট খ্যাতি --excolve = পাথ / থেকে / ফাইলগুলি, পাথ / থেকে / অন্যান্য / ফাইলগুলি
ম্যাকিয়েজ সোচ

2
@ অ্যাডাম: আপনার কি এখনও এ নিয়ে সমস্যা হচ্ছে? ওএস এক্স 10.9.5 এ আমার জন্য খুব ভাল কাজ করে।
স্যাম ডটন

2
এই রত্নটির যে কাজটি করা দরকার তার চেয়ে কম কিছু কমিট করার চেয়ে বড় কোনও রেপোর জন্য জ্যোতির্বিজ্ঞান
এরিক

48
git ls-tree -r HEAD|sed -re 's/^.{53}//'|while read filename; do file "$filename"; done|grep -E ': .*text'|sed -r -e 's/: .*//'|while read filename; do git blame -w "$filename"; done|sed -r -e 's/.*\((.*)[0-9]{4}-[0-9]{2}-[0-9]{2} .*/\1/' -e 's/ +$//'|sort|uniq -c

ধাপে ধাপে ব্যাখ্যা:

সংস্করণ নিয়ন্ত্রণে সমস্ত ফাইল তালিকাভুক্ত করুন

git ls-tree -r HEAD|sed -re 's/^.{53}//'

কেবল পাঠ্য ফাইলগুলিতে তালিকাটি ছাঁটাই করুন

|while read filename; do file "$filename"; done|grep -E ': .*text'|sed -r -e 's/: .*//'

গাইট সাদা বাক্সের পরিবর্তনগুলি উপেক্ষা করে সমস্ত পাঠ্য ফাইলকে দোষ দিবে

|while read filename; do git blame -w "$filename"; done

লেখকের নাম টানুন

|sed -r -e 's/.*\((.*)[0-9]{4}-[0-9]{2}-[0-9]{2} .*/\1/' -e 's/ +$//'

লেখকের তালিকাকে বাছাই করুন এবং একের পরপর পুনরাবৃত্তি করা লাইনের সংখ্যা গণনা করুন

|sort|uniq -c

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

   1334 Maneater
   1924 Another guy
  37195 Brian Ruby
   1482 Anna Lambda

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

7
কিছু নয়, sudo brew install gnu-sedসমাধান করুন solved একটি যাদুমন্ত্র মত কাজ করে!
এরিক অাইনার

5
অথবা port install gsedম্যাকপোর্টস ব্যবহারকারীদের জন্য।
গ্যাভিন ব্রক

আমি একটি করেছি sudo brew install gnu-sed(যা কাজ করেছিল) তবে আমি এখনও ত্রুটিগুলি পেয়েছি যা শেড -r সনাক্ত করে না। :(
অ্যাডাম টটল

1
ওএসএক্স-এ ম্যাকপোর্টের মাধ্যমে জিএসড ইনস্টল করার পরে আমি এই কমান্ডটি এটি চালানোর জন্য চালিয়েছি (জিএসডের সাথে সেড প্রতিস্থাপন করা হয়েছে):git ls-tree -r HEAD|gsed -re 's/^.{53}//'|while read filename; do file "$filename"; done|grep -E ': .*text'|gsed -r -e 's/: .*//'|while read filename; do git blame -w "$filename"; done|gsed -r -e 's/.*\((.*)[0-9]{4}-[0-9]{2}-[0-9]{2} .*/\1/' -e 's/ +$//'|sort|uniq -c
নার্ডারড

38

git summaryদ্বারা উপলব্ধ Git-অতিরিক্ত প্যাকেজ ঠিক কি আপনি প্রয়োজন। গিট-অতিরিক্তে ডকুমেন্টেশন চেকআউট করুন - গিট-সারাংশ :

git summary --line

এর মতো দেখতে আউটপুট দেয়:

project  : TestProject
lines    : 13397
authors  :
8927 John Doe            66.6%
4447 Jane Smith          33.2%
  23 Not Committed Yet   0.2%

1
দুর্দান্ত, তবে কোনও পাথ ফিল্টার বা কমপক্ষে একটি উপ ডিরেক্টরি আর্গুমেন্ট সমর্থন করে বলে মনে হচ্ছে না। ভাল লাগবে।
স্পিন্কাস

1
সুন্দর এবং পরিষ্কার সমাধান। @ অ্যালেক্সের উত্তরটি কোনও কারণে খুব সামান্য লাইন গণনা করেছে। এটি কেবল বাক্সের বাইরে কাজ করেছে। কয়েকশ ফাইলগুলিতে ছড়িয়ে 200 ডলার লাইনের জন্য 30 সেকেন্ডের মতো কিছু নিয়েছে।
fgblomqvist

6

এরিকের সমাধানটি দুর্দান্ত ছিল, তবে ডায়াক্রিটিক্সের সাথে আমার কিছু সমস্যা ছিল (যদিও আমার LC_*পরিবেশের পরিবর্তনশীলগুলি সঠিকভাবে সঠিকভাবে সেট করা সত্ত্বেও ) এবং কোডের লাইনে গোলমাল ফাঁস হতে থাকে যেগুলির মধ্যে তারিখগুলি ছিল। আমার সিড-ফু দুর্বল, সুতরাং আমি রুবীর সাথে এই ফ্র্যাঙ্কস্টেইন স্নিপেটের সাথে শেষ করেছি, তবে এটি আমার পক্ষে নির্লজ্জভাবে 200,000+ এলওসি তে কাজ করে এবং ফলাফলগুলি সাজায়:

git ls-tree -r HEAD | gsed -re 's/^.{53}//' | \
while read filename; do file "$filename"; done | \
grep -E ': .*text' | gsed -r -e 's/: .*//' | \
while read filename; do git blame "$filename"; done | \
ruby -ne 'puts $1.strip if $_ =~ /^\w{8} \((.*?)\s*\d{4}-\d{2}-\d{2}/' | \
sort | uniq -c | sort -rg

gsedপরিবর্তে নোট করুন sedকারণ এটি বাইনারি হোমব্রিউ ইনস্টল করে, সিস্টেমটি অটুট রেখে দেয়।


4

git shortlog -sn

এটি লেখক প্রতি কমিটের একটি তালিকা প্রদর্শন করবে।


17
এটি লেখকের প্রতি কমিটের সংখ্যা দেয়, লাইন সংখ্যা নয়।
v64

একটি প্রকল্প / ডিরেক্টরি / ফাইলের প্রধান অবদানকারীদের নির্ধারণে খুব সহায়ক
আয়েরেস

4

@ অ্যালেক্সের উত্তর থেকে প্রাথমিক স্নিপেট এখানে দেওয়া হয়েছে যা দোষের রেখাগুলি একত্রিত করার কাজটি করে actually আমি সেটগুলি কেটে ফেলেছি একটি সেট ফাইলের পরিবর্তে কোনও একক ফাইলের জন্য operate

git blame --line-porcelain path/to/file.txt | grep  "^author " | sort | uniq -c | sort -nr

আমি এটি এখানে পোস্ট করছি কারণ আমি প্রায়শই এই উত্তরে ফিরে আসি এবং পোস্টটি পুনরায় পড়ি এবং যে অংশটিকে আমি মূল্যবান বলে মনে করি তার অংশটি বের করতে উদাহরণগুলি পুনরায় হজম করছি। না এটি আমার ব্যবহারের ক্ষেত্রে যথেষ্ট জেনেরিক; এর ব্যাপ্তি পুরো সি প্রকল্পের জন্য।


আমি প্রতি ফাইলের পরিসংখ্যানগুলি তালিকাবদ্ধ করতে চাই, forতার পরিবর্তে ব্যাশ পুনরাবৃত্তাকারীর মাধ্যমে অর্জন xargsকরায় আমি xargs কম পঠনযোগ্য এবং ব্যবহার করতে / স্মরণে রাখতে শক্ত দেখতে পাই, এর সুবিধা / অসুবিধাগুলি xargs বনাম অন্য কোথাও আলোচনা করা উচিত।

এখানে একটি ব্যবহারিক স্নিপেট যা প্রতিটি ফাইলের জন্য পৃথকভাবে ফলাফল প্রদর্শন করবে:

for file in $(git ls-files); do \
    echo $file; \
    git blame --line-porcelain $file \
        | grep  "^author " | sort | uniq -c | sort -nr; \
    echo; \
done

এবং আমি পরীক্ষা করেছি, ব্যাশ শেলের মধ্যে এই স্ট্রাইটটি চালানো ctrl + c নিরাপদ, আপনার যদি এটি কোনও ব্যাশ স্ক্রিপ্টের ভিতরে রাখার দরকার হয় তবে আপনি নিজের লুপের জন্য ব্যবহারকারীকে লঙ্ঘন করতে সক্ষম করতে চাইলে আপনাকে সাইন ইন এবং সাইনটারমে ট্র্যাপ করতে হবে।


1
git blame -w -M -C -C --line-porcelain path/to/file.txt | grep -I '^author ' | sort | uniq -ic | sort -nrgit blame এখানে একটি সামান্য ঝাঁকুনি খুঁজে পেয়েছি যে আমি যে পরিসংখ্যানগুলি খুঁজছিলাম তার আরও সঠিকভাবে চিত্রিত করা হয়েছে। বিশেষত, -M এবং -C -C বিকল্প (সেগুলি দুটি সি এর উদ্দেশ্যে হয়)। -M ফাইলের মধ্যে নড়াচড়া সনাক্ত করে এবং -সি-সি অন্যান্য ফাইল থেকে অনুলিপি করা লাইনগুলি সনাক্ত করে। এখানে ডক দেখুন । সম্পূর্ণতার জন্য, আমরা সাদা স্থান উপেক্ষা করি।
জন লি


1

আমার কাছে এই সমাধানটি রয়েছে যা সমস্ত পাঠ্য ফাইলগুলিতে দোষযুক্ত রেখাগুলি গণনা করে (বাইনারি ফাইলগুলি, এমনকি সংস্করণযুক্ত ফাইলগুলি বাদ দিয়ে):

IFS=$'\n'
for file in $(git ls-files); do
    git blame `git symbolic-ref --short HEAD` --line-porcelain "$file" | \
        grep  "^author " | \
        grep -v "Binary file (standard input) matches" | \
        grep -v "Not Committed Yet" | \
        cut -d " " -f 2-
    done | \
        sort | \
        uniq -c | \
        sort -nr

1

এটি কোনও নির্দিষ্ট উত্সের মডিউল পরিদর্শন করতে চাইলে রেপোগুলির উত্স কাঠামোর যে কোনও ডিরেক্টরিতে কাজ করে।

find . -name '*.c' | xargs -n1 git blame --line-porcelain | grep "^author "|sort|uniq -c|sort -nr

0

আমি পাওয়ারশেলের শীর্ষ উত্তর গ্রহণ করেছি :

(git ls-tree -rz --name-only HEAD).Split(0x00) | where {$_ -Match '.*\.py'} |%{git blame -w --line-porcelain HEAD $_} | Select-String -Pattern '^author ' | Group-Object | Select-Object -Property Count, Name | Sort-Object -Property Count -Descending

আপনি স্যুইচ git blameদিয়ে চালাচ্ছেন কিনা -wএটি alচ্ছিক, আমি এটিকে যুক্ত করেছি কারণ এটি শ্বেত স্থান পরিবর্তনগুলি উপেক্ষা করে।

আমার মেশিনে পারফরম্যান্স পাওয়ারশেলের পক্ষে ছিল (একই রেপোর জন্য ~ 50s বনাম s 65s), যদিও বাশ সমাধান ডাব্লুএসএল 2 এর অধীনে চলছিল although


-1

আমার নিজস্ব স্ক্রিপ্ট তৈরি করেছেন যা @ নীলবাস এবং @ অ্যালেক্সের সংমিশ্রণ

#!/bin/sh

for f in $(git ls-tree -r  --name-only HEAD --);
do
    j=$(file "$f" | grep -E ': .*text'| sed -r -e 's/: .*//');
    if [ "$f" != "$j" ]; then
        continue;
    fi
    git blame -w --line-porcelain HEAD "$f" | grep  "^author " | sed 's/author //'`enter code here`
done | sort | uniq -c | sort -nr

আমার জন্য, আপনার জিনিস enter code hereসমস্যা সৃষ্টি করছিল .... এটি কি সঠিকভাবে কাজ করে?
মেনিয়োস

-1

বাশ ফাংশন যা MacOS এ চালিত একক উত্স ফাইলকে লক্ষ্য করে।

function glac {
    # git_line_author_counts
    git blame -w "$1" |  sed -E "s/.*\((.*) +[0-9]{4}-[0-9]{2}.*/\1/g" | sort | uniq -c | sort -nr
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.