Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to count number of commits per file pathname by author in a Git repository?

Tags:

git

While git-blame and counting number of lines changed by an author within a git repository are helpful, is there a command that can list all of the pathnames modified in a repo across all commits by either an author or set of authors that scores each file by the number of commits by that author or set of authors? E.g. the output from running such a command in a cloned git repo would be similar to:

1    /path/to/some/file/in/repo/file1
34   /path/to/some/file/in/repo/file2
3    /path/to/some/other/file/in/repo/anotherfile
...

Thanks!

like image 558
Gary S. Weaver Avatar asked Sep 15 '14 14:09

Gary S. Weaver


1 Answers

Just realized that if you use --name-only to print the filenames, pretty format as empty string, and use this method to sort, uniq, and sort by top number of commits, in *nix/OS X, you could use:

git log --name-only --author=John --pretty=format: | sort | uniq -c | sort -nr

Be sure that you are using the right author.

E.g. if we were trying to find DHH's authors in Rails, we might do:

git log --format='%aN <%aE>' | LC_ALL='C' sort -u | grep avid

and notice that all of DHH's authors in the Rails git repo use the name "David Heinemeier Hansson". So, then we could do:

git log --name-only --author="David Heinemeier Hansson" --pretty=format: | sort | uniq -c | sort -nr

Which might output:

3624 
 611 actionpack/CHANGELOG
 432 activerecord/CHANGELOG
 329 railties/CHANGELOG
 206 activerecord/lib/active_record/base.rb
 195 activesupport/CHANGELOG
 157 actionpack/lib/action_controller/base.rb
 153 railties/Rakefile
 108 activerecord/lib/active_record/associations.rb
  79 actionpack/lib/action_view/helpers/javascript_helper.rb
  75 activerecord/lib/active_record/validations.rb
  74 activerecord/test/base_test.rb
  69 actionmailer/CHANGELOG
  66 railties/lib/rails_generator/generators/applications/app/app_generator.rb
  66 activerecord/Rakefile
  66 actionpack/lib/action_controller/caching.rb
  60 actionpack/lib/action_controller/routing.rb
  59 railties/lib/initializer.rb
  59 actionpack/Rakefile
  57 actionpack/lib/action_controller/request.rb
  ...

So, as of 2015-02-21, there were 3624 files in the Rails git repo that it appears he never personally made commits to, the top number of commits for a file was the ActionPack CHANGELOG at 611 commits, followed by the ActiveRecord CHANGELOG, and ActiveRecord::Base was the Ruby file he made the most commits to.

If you want to exclude the number of files not touched from the counts, use --format= instead of --pretty=format:, e.g.:

git log --name-only --author="David Heinemeier Hansson" --format: | sort | uniq -c | sort -nr
like image 124
Gary S. Weaver Avatar answered Oct 21 '22 08:10

Gary S. Weaver