Git,找出哪些文件提交次数最多

JP *_*shy 24 git

如何搜索我的git日志以查看哪些文件的活动最多?

seh*_*ehe 41

这是非常容易的事情之一(?):

git rev-list --objects --all | awk '$2' | sort -k2 | uniq -cf1 | sort -rn | head
Run Code Online (Sandbox Code Playgroud)
  1. 给我所有分支中所有修订的所有对象
  2. 忽略任何没有路径的结果
  3. 按路径排序
  4. 使它们唯一(忽略blob哈希),带有重复计数的前缀行
  5. 按重复计数降序排序
  6. 显示最顶层的线条

输出类似于

   1058 fffcba193374a85fd6a3490f800c6901218a950b src
    715 ffffe0f08798e95b66cc4ad4ff22cf10734d045e src/lib
    450 ffcfe596031a5985664e35937fff4ac9ff38dcca src/zfs-fuse
    367 ffc5d5340f95360fc9f7b739c5593dd3f92fced0 src/lib/libzpool
    202 ff92db000792044d45eec21c57a3cd21618631e7 src/lib/libsolkerncompat
    183 ff1a44edae3fd121ddd86864b589e5ab2f9ff99b src/lib/libzfscommon
    178 fec6b3a789e578983c2242b3aa5adf217cb8b887 src/lib/libzfs
    168 ffeefc9e81222d7c471bdb0911d8b98f23cff050 src/cmd
    167 fbd60bd3430765863648c52db7ceb3ffa15d5e50 src/lib/libzfscommon/include
    155 ff225f6b41f9557d683079c5f9276f497bcb06bd src/lib/libzfscommon/include/sys
Run Code Online (Sandbox Code Playgroud)

你可以从这里拿走它.

例如,如果您只想查看文件blob:

git rev-list --objects --all | awk '$2' | sort -k2 | uniq -cf1 | sort -rn |
    while read frequency sample file
    do 
       [ "blob" == "$(git cat-file -t $sample)" ] && echo -e "$frequency\t$file";
    done
Run Code Online (Sandbox Code Playgroud)

输出:

135 src/zfs-fuse/zfs_operations.c
84  src/zfs-fuse/zfs_ioctl.c
79  src/zfs-fuse/zfs_vnops.c
73  src/lib/libzfs/libzfs_dataset.c
67  src/lib/libzpool/spa.c
66  src/zfs-fuse/zfs_vfsops.c
62  src/cmd/zdb/zdb.c
62  CHANGES
60  src/cmd/ztest/ztest.c
60  src/lib/libzpool/arc.c
Run Code Online (Sandbox Code Playgroud)

您只想查看特定范围的修订

你可以有一个球与rev-list部分:

git rev-list --after=2011-01-01 --until='two weeks ago' \
     tag1...remote/hotfix ^master
Run Code Online (Sandbox Code Playgroud)

将仅使用指定日期范围内的修订版本,这些修订版本位于对称集合中tag1,remote/hotfix并且不在 master中


Ase*_*nar 7

使用git effort [--above <value>](来自 git-extras 包)列出所有文件和相关提交的数量。

您可以限制为路径


nem*_*mba 5

我最近在一个源代码完全由java文件组成的项目中需要类似的东西。与sehe的答案类似,我用它作为基础并进行了扩展,因为我想在没有循环的情况下在一行中完成它。我的问题是变化最大的前 5 个文件是什么?

git rev-list --objects --all | awk '$2 ~ /\.java/' | awk '{print $2}' | sort -k2 | uniq -c | sort -rn | head -n 5
Run Code Online (Sandbox Code Playgroud)

分解它:

  1. git rev-list --objects --all:给我所有分支的所有对象
  2. awk '$2 ~ /.java/':使用正则表达式过滤掉第二个参数 ($2) 不包含短语 .java (~ /.java/) 的行
  3. awk '{print $2}':打印第二个参数
  4. sort : 按路径排序
  5. uniq -c:使它们唯一并计算每个文件出现的次数
  6. sort -r:逆序排序
  7. head -n 5:将结果限制为前 5 个

输出是

130 richtextfx/src/main/java/org/fxmisc/richtext/GenericStyledArea.java
126 richtextfx/src/main/java/org/fxmisc/richtext/StyledTextArea.java
 58 richtextfx/src/main/java/org/fxmisc/richtext/ParagraphText.java
 47 richtextfx/src/main/java/org/fxmisc/richtext/EditableStyledDocument.java
 43 richtextfx/src/main/java/org/fxmisc/richtext/skin/StyledTextAreaVisual.java
Run Code Online (Sandbox Code Playgroud)