如何在Git存储库中按作者计算每个文件路径名的提交次数?

时间:2014-09-15 14:14:07

标签: git

虽然git存储库中的作者的git-blamecounting number of lines changed是有用的,但是有一个命令可以列出所有提交中由作者或一组提交的修订中修改的所有路径名作者根据作者或作者集的提交次数对每个文件进行评分?例如。在克隆的git仓库中运行这样一个命令的输出类似于:

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
...

谢谢!

2 个答案:

答案 0 :(得分:15)

刚才意识到,如果你使用--name-only来打印文件名,那么格式为空字符串,并使用this method进行排序,uniq,并按照提交的最大数量进行排序,在* nix / OS中X,你可以使用:

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

请确保您使用的是正确的作者。

E.g。如果我们试图在Rails中找到DHH的作者,我们可能会这样做:

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

并注意到所有DHH在Rails git repo中的作者都使用“David Heinemeier Hansson”这个名字。那么,我们就可以做到:

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

可能输出:

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
  ...

因此,截至2015-02-21,Rails git repo中有3624个文件似乎他从未亲自提交过,文件的最大提交数是611提交的ActionPack CHANGELOG,其次是ActiveRecord CHANGELOG和ActiveRecord :: Base是他最常提交的Ruby文件。

如果您想从计数中排除未触及的文件数,请使用--format=代替--pretty=format:,例如:

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

答案 1 :(得分:2)

PowerShell示例

显示当前工作树中每个文件的指定作者的提交计数。

简短表格

$author = 'shaun';
dir -r | % { New-Object PSObject -Property `
@{ `
   Count = git rev-list HEAD --count --author=$author -- $_.Name; `
   FileName = $_.Name; `
}} `
| sort Count | % { $_.Count + ' -- ' + $_.FileName + ' -- ' + $author; }

长表格

$author = 'shaun'; `
Get-ChildItem -recurse | ForEach-Object `
{ `
   New-Object PSObject -Property `
   @{ `
       Count = git rev-list HEAD --count --author=$author -- $_.Name; `
       FileName = $_.Name; `
    } `
} | ` 
Sort-Object Count | ForEach-Object ` 
{ ` 
   $_.Count + ' -- ' + $_.FileName + ' -- ' + $author; `
} 

注释

  • `表示在新行上继续执行命令。
  • |表示将结果对象传递给下一个命令。
  • $_.SomeProperty从对象中的管道访问属性。
  • 您可以将此目录复制/粘贴到PowerShell中,因为`标记表示新行。
  • 包括filter-branch以跟踪先前删除的文件和其他分支。
  • 包含git log --format='%aN' | sort -u以遍历所有项目作者

输出

0 -- blame.txt~ -- shaun
0 -- .blame.txt.un~ -- shaun
1 -- GitBook-GitTools-06-RewritingHistory.asc -- shaun
1 -- GitBook-GitTools-05-Searching.asc -- shaun
1 -- GitBook-GitTools-03-StashingAndCleaning.asc -- shaun
1 -- GitBook-GitTools-07-ResetDemystified.asc -- shaun
1 -- README.md -- shaun
1 -- LICENSE -- shaun
1 -- GitBook-GitTools-09-Rerere.asc -- shaun
1 -- GitBook-GitBranching-Rebasing.asc -- shaun
1 -- blame2.txt -- shaun
1 -- GitBook-GettingStarted-FirstTimeSetup.asc -- shaun
1 -- GitBook-GitTools-02-InteractiveStaging.asc -- shaun
1 -- GitBook-GitTools-01-RevisionSelection.asc -- shaun
1 -- GitBook-GitInternals-Maintenance.asc -- shaun
2 -- goals.asc -- shaun
2 -- GitBook-GitTools-10-Debugging.asc -- shaun
3 -- blame.txt -- shaun
6 -- GitBook-GitTools-08-AdvancedMerging.asc -- shaun