You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Git新手咨询:如何查找项目中至少共同变更4次的3文件集合

查找Git项目中共同变更≥4次的3文件集合

嘿,作为Git新手在Mac终端上搞定这个需求其实不难,咱们可以通过Git命令+Shell工具组合来实现——核心思路就是先把所有提交里修改的文件都提取出来,再统计每三个文件一起出现的次数,最后筛选出次数≥4的组合就行。

步骤1:先导出所有提交的修改文件列表

首先用git log把每个提交对应的修改文件导出来,命令如下:

git log --name-only --pretty=format:"COMMIT:%H" | grep -v "^$"

这个命令跑出来的内容大概是这样的:

COMMIT:a1b2c3d
src/file1.js
src/file2.css
src/file3.html
COMMIT:e4f5g6h
src/file1.js
src/file3.html
src/file4.py

简单解释下参数:

  • --name-only:只显示每个提交里被修改的文件,不输出其他提交信息
  • --pretty=format:"COMMIT:%H":用COMMIT:加提交哈希的格式标记每个提交的开始,方便后面区分不同提交的文件
  • grep -v "^$":把空行过滤掉,让输出更清爽

步骤2:生成3文件组合并统计次数

接下来要把每个提交里的文件生成所有可能的3文件组合,然后统计每个组合一起出现的次数。这里给你两种方案,选你觉得顺手的来:

方案A:纯Shell环境(用awk脚本)

直接把下面一整段命令复制到终端执行就行:

git log --name-only --pretty=format:"COMMIT:%H" | grep -v "^$" | awk '
    /^COMMIT:/ {
        if (files_count >=3) {
            # 生成当前提交里所有3文件的组合
            for (i=1; i<=files_count-2; i++) {
                for (j=i+1; j<=files_count-1; j++) {
                    for (k=j+1; k<=files_count; k++) {
                        printf "%s|%s|%s\n", files[i], files[j], files[k]
                    }
                }
            }
        }
        # 重置当前提交的文件列表,准备处理下一个提交
        delete files
        files_count=0
        next
    }
    {
        # 把当前行的文件名加入列表
        files_count++
        files[files_count] = $0
    }
    END {
        # 别忘了处理最后一个提交的文件
        if (files_count >=3) {
            for (i=1; i<=files_count-2; i++) {
                for (j=i+1; j<=files_count-1; j++) {
                    for (k=j+1; k<=files_count; k++) {
                        printf "%s|%s|%s\n", files[i], files[j], files[k]
                    }
                }
            }
        }
    }
' | sort | uniq -c | awk '$1 >=4 {print $0}'

这段命令的逻辑是:

  1. awk脚本会遍历每个提交的文件,当文件数≥3时,生成所有不重复的3文件组合(用|分隔开)
  2. sort | uniq -c:把所有组合排序,然后统计每个组合出现的次数
  3. 最后一个awk '$1 >=4':只保留出现次数≥4的组合,输出格式是「次数 文件1|文件2|文件3」

方案B:用Python脚本(更易读,适合新手)

如果你的Mac已经装了Python(系统默认就有),这个方案会更简单。先创建一个小脚本:
打开终端,输入touch count_file_triples.py创建文件,然后用编辑器打开它(比如open -e count_file_triples.py),把下面的代码粘进去:

import sys
from itertools import combinations

current_files = []
for line in sys.stdin:
    line = line.strip()
    if not line:
        continue
    if line.startswith("COMMIT:"):
        # 处理上一个提交的文件列表
        if len(current_files) >=3:
            # 生成所有3文件的组合,排序是为了避免重复统计(比如file1+file2+file3和file2+file1+file3算同一个组合)
            for triple in combinations(sorted(current_files), 3):
                print("|".join(triple))
        current_files = []
        continue
    current_files.append(line)
# 处理最后一个提交的文件
if len(current_files) >=3:
    for triple in combinations(sorted(current_files), 3):
        print("|".join(triple))

保存后回到终端,执行这个命令:

git log --name-only --pretty=format:"COMMIT:%H" | python count_file_triples.py | sort | uniq -c | awk '$1 >=4'

这个方案用Python的itertools.combinations来生成三元组,代码逻辑更直观,新手也容易看懂。

小提示

  • 如果你的项目提交特别多,这个命令可能会跑一会儿,别着急,等它结束就行
  • 上面的命令会包含所有类型的文件变更(修改、添加、删除),如果你只想统计被修改的文件,可以把git log的部分换成这个:
    git log --name-status --pretty=format:"COMMIT:%H" | grep -v "^$" | grep -v "^D" | grep -v "^A" | sed 's/^M\t//'
    
    把这个替换到前面命令里的git log部分,就只会保留被修改(标记为M)的文件啦。

内容的提问来源于stack exchange,提问作者user8863554

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:31:26