在Git中查找更改最多的文件


Answers:


45

您可以使用git effort(来自git-extras软件包)命令,该命令显示有关每个文件的提交次数(按提交次数和活动天数)的统计信息。

编辑:git的努力只是一个bash脚本,您可以在这里找到并适应您的需求,如果您需要更特殊的东西。


输出将分为两部分,首先获得未排序的结果,然后再进行排序(和着色)的结果。对?
安迪

@Andy似乎(并且git help effort对此没有信息:/)。我假设第一组结果按文件名排序,第二组结果按每个文件的提交次数排序。该手册页还提到了github.com/tj/git-extras/issues报告问题
Asenar,2016年

这与此相似吗?blog.riff.org/...

155

您可以执行以下操作:

git log --pretty=format: --name-only | sort | uniq -c | sort -rg | head -10

日志仅输出每次提交中已更改的文件的名称,而日志的其余部分仅排序并输出最常出现的前10个文件名。


您能告诉我这是基于当前分支还是针对整个存储库?尚未合并的分支怎么办?
Karthick S 2013年

@KarthickS:这仅适用于当前分支中的提交- 如果要在任何本地分支中包含提交,则可以添加--branches到中git log
Mark Longair

1
真好 此外,我发现它还报告了很久以前删除的文件。快速解决方案是限制时间,例如:--since =“ last year”
FractalSpace

2
使用--since "1 month ago"或其他选项来缩小时间范围也很有帮助

3
找到了我的答案的一部分:git log --pretty=format: --since="1 year ago" --name-only -- "*.java" | sort | uniq -c | sort -rg | head -10
AdamMc331

13

我注意到 Marksehe的 答案都不--follow是文件,也就是说,一旦文件重命名,它们就会停止。这个脚本会慢很多,但是可以达到这个目的。

git ls-files |
while read aa
do
  printf . >&2
  set $(git log --follow --oneline "$aa" | wc)
  printf '%s\t%s\n' $1 "$aa"
done > bb
echo
sort -nr bb
rm bb

git-most.sh


1
为了对此进行扩展,我创建了gist.github.com/caleb15/da591031936f35d80e14a42ca7ba4350。 它针对文件夹(尤其是目录中的每个文件夹)汇总更改,roles对于我的情况,但是可以轻松修改以适合您的用例。
Almenon

3

对于Powershell,假设您已安装git bash

git log --pretty=format: --name-only | sort | uniq -c | sort -Descending | select -First 10

3

这是Windows版本

git log --pretty=format: --name-only  > allfiles.csv

然后在excel中打开

A1: FileName
A2: isVisibleFilename  >> =IFERROR(IF(C2>0,TRUE,FALSE),FALSE)
A3: DotLocation >> =FIND("@",SUBSTITUTE(A2,".","@",(LEN(A2)-LEN(SUBSTITUTE(A2,".","")))/LEN(".")))
A4: HasExt       >> =C2>1
A5: TYPE        >> =IF(D2=TRUE,MID(A2,C2+1,18),"")

创建数据透视表

values: Type
  Filter: isFilename = true
  Rows : Type
  Sub : FileName

click [Count Of TYPE] -> Sort -> Sort Largest To Smallest

因为我对excel不太了解,所以我不理解这些说明。
BigMiner

2
git whatchanged --all | \grep "\.\.\." | cut -d' ' -f5- | cut -f2- | sort | uniq -c | sort

如果您只想查看文件添加--authorgit whatchanged --author=name --all


1

旧问题,但我认为仍然是一个非常有用的问题。这是笔直的Powershell中的工作示例。相对于您所在的分支,这将在您的存储库中获取变化最大的10个文件。

git log --pretty=format: --name-only | Where-Object { ![string]::IsNullOrEmpty($_) } | Sort-Object | Group-Object  | Sort-Object -Property Count -Descending | Select-Object -Property Count, Name -First 10

0

我们还可以找出在两次提交或分支之间更改的文件,例如

git log  --pretty=format: --name-only <source_branch>...<target_branch> | sort | uniq -c | sort -rg | head -50 

0

这可能很明显,但是提供的查询将显示所有文件,但是,也许您对知道配置文件或项目文件是最新的不感兴趣。一个简单的grep将隔离到您的代码文件,例如:

git log --pretty=format: --name-only | grep .cs$ | sort | uniq -c | sort -rg | head -20
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.