虽然git存储库中的作者的git-blame和counting 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
...
谢谢!
答案 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)
显示当前工作树中每个文件的指定作者的提交计数。
$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
从对象中的管道访问属性。`
标记表示新行。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