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}'
这段命令的逻辑是:
- awk脚本会遍历每个提交的文件,当文件数≥3时,生成所有不重复的3文件组合(用
|分隔开) sort | uniq -c:把所有组合排序,然后统计每个组合出现的次数- 最后一个
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
相关产品推荐
相关产品推荐

