如何统计Git仓库中每个文件路径名的提交次数?

k7fdbhmy  于 2022-11-20  发布在  Git
关注(0)|答案(3)|浏览(213)

虽然git仓库中某个作者的git-blamecounting number of lines changed很有用,但是否有一个命令可以列出某个作者或一组作者在仓库中修改的所有路径名,并根据该作者或一组作者的提交次数对每个文件进行评分?例如,在克隆的git仓库中运行这样的命令,输出结果如下:
谢谢你!

s6fujrry

s6fujrry1#

我刚刚意识到,如果你使用--name-only来打印文件名,漂亮的格式为空字符串,并使用this method来排序,uniq,并按提交次数排序,在 *nix/OS X中,你可以用途:

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

请确保使用正确的作者。
例如,如果我们试图在Rails中找到DHH的作者,我们可能会这样做:

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

请注意,在Rails git repo中,DHH的所有作者都使用“大卫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年2月21日,Rails git repo中有3624个文件,他似乎从未亲自提交过,提交次数最多的文件是ActionPack CHANGELOG,为611次,其次是ActiveRecord CHANGELOG,ActiveRecord::Base是他提交次数最多的Ruby文件。
如果要从计数中排除未接触的文件数,请使用--format=而不是--pretty=format:,例如:

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

lzfw57am2#

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中,因为```标记表示新行。
  • 包括X1 M4 N1 X,以便还跟踪先前删除的文件和其它分支。
  • 包括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
yfwxisqw

yfwxisqw3#

我发现把这个git别名添加到.gitconfig会很有帮助:

# list commit counts by file
cc = "!cd ${GIT_PREFIX:-./}; git log --name-only --format= \"$@\" | sort | uniq -c | sort -nr | head -30 #"
# list commit counts by folder
ccf = "!cd ${GIT_PREFIX:-./}; git log --name-only --format= \"$@\" | rev | cut -d'/' -f2- | rev | sort | uniq -c | sort -nr | head -30 #"

然后,您可以使用与git log相同的参数,例如:

git cc --author=hank --since="1 year ago" -- path/to/some/folder

相关问题