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

Posted

技术标签:

【中文标题】如何在 Git 存储库中按作者计算每个文件路径名的提交次数?【英文标题】:How to count number of commits per file pathname by author in a Git repository? 【发布时间】:2014-11-09 02:26:45 【问题描述】:

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

谢谢!

【问题讨论】:

你会做出薪酬决定吗? :) 不。只是想确定可以关注的代码部分,并且作者使用每个文件的 # 次提交将是确定要关注的代码部分以进行知识转移的一种方法当员工离开时。 你愿意写一个批处理文件吗?如果是这样,您可以使用git rev-list HEAD --count --author=someDude -- somefile.txt 创建计数输出。 【参考方案1】:

刚刚意识到,如果您使用--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 的作者都使用了“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 年 2 月 21 日,Rails git 存储库中有 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

【讨论】:

这太棒了,它真的帮助了我。谢谢!【参考方案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

【讨论】:

这是如何工作的?我想对其进行调整以获取 repo 中每个***目录的提交,或者至少获取每个文件的完整路径。 我为您添加了一个长格式的 PowerShell。如果您还有其他问题,请告诉我。

以上是关于如何在 Git 存储库中按作者计算每个文件路径名的提交次数?的主要内容,如果未能解决你的问题,请参考以下文章

如何管理 git 存储库中的 IDE 文件?

git将上游设置为存储库中的远程文件夹

将 Bitrise 配置文件存储在 git 存储库中

如何在 git 存储库中重写提交者名称? [复制]

在 git 存储库中移动大量大文件

如何在 Git 存储库中删除多个已删除的文件