Extracting a list of committers from Git
There doesn’t seem to be a nice way to getting stats like “who are the committers in this project” from Git. There is probably some fancy script that does sed/awk magic to do so, but I went with a simpler alternative:
git log --raw > log.txt
var logFile = @"C:\work\ravendb\log.txt"; var committers = from line in File.ReadAllLines(logFile) where line.StartsWith("Author: ") let author = line.Substring("Author: ".Length) group author by author into g let result = new {Committer = g.Key, CommitsCount = g.Count()} orderby result.CommitsCount descending select result; foreach (var committer in committers) { Console.WriteLine(committer); }
Running this on Raven’s code produces:
{ Committer = Ayende Rahien <ayende>, CommitsCount = 555 }
{ Committer = Ayende Rahien <Ayende>, CommitsCount = 477 }
{ Committer = unknown <Ayende, CommitsCount = 72 }
{ Committer = Paul B <github, CommitsCount = 24 }
{ Committer = Andrew Stewart <Andrew.Stewart, CommitsCount = 24 }
{ Committer = Benny Thomas <jan.thomas, CommitsCount = 19 }
{ Committer = Luke Hertert <lukehertert, CommitsCount = 15 }
{ Committer = Bobby Johnson <bobby.johnson, CommitsCount = 13 }
{ Committer = Rob Ashton <robashton, CommitsCount = 11 }
{ Committer = unknown <LukeHertert, CommitsCount = 7 }
{ Committer = Andrew Theken <theken.1, CommitsCount = 6 }
{ Committer = AndyStewart <Andy.Stewart, CommitsCount = 3 }
{ Committer = Steve Strong <steve, CommitsCount = 3 }
{ Committer = unknown <Aaron Weiker, CommitsCount = 1 }
{ Committer = Emil Cardell <emil.cardell, CommitsCount = 1 }
{ Committer = bjarte.skogoy <bjarte.skogoy, CommitsCount = 1 }
{ Committer = unknown <henke, CommitsCount = 1 }
Comments
git log --raw | grep "^Author: " | sort | uniq -c
The gitstat tool from the internets looks nice, considering git apparently doesn't have the equivalent of hg churn.
For completeness a powershell version that uses what is contained in the < and >:
git log --raw | Select-String -Pattern "^Author.<(.)>" | % { $_.Matches[
0].Groups[1].Value } | Group-Object | select count, name
git shortlog -s
+1 Larsen's solution
Just one problem with all of the things that were suggested.
They requires me to THINK about those.
My solution was coded under heavy time pressure and I just needed the answers.
Going with the route of least resistance was the easiest and faster way to get things done.
That's a neat query. I think it's neater than my Ruby hacking: http://gist.github.com/396634
That's why I couldn't live without linqPad anymore!
Ah... Cosmin 0wns us all. :-)
Nice one, but how about streaming from a file? You'd be better off not having to read the whole file into memory which is precisely what LINQ allows you to do.
<string GetEnumerator()
Comment preview