惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
The GitHub Blog
The GitHub Blog
Vercel News
Vercel News
D
DataBreaches.Net
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
小众软件
小众软件
美团技术团队
T
The Blog of Author Tim Ferriss
爱范儿
爱范儿
D
Docker
Martin Fowler
Martin Fowler
大猫的无限游戏
大猫的无限游戏
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
H
Hackread – Cybersecurity News, Data Breaches, AI and More
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
S
SegmentFault 最新的问题
云风的 BLOG
云风的 BLOG
B
Blog
雷峰网
雷峰网
The Cloudflare Blog

小松鼠的博客

记录一次线上k8s工作节点无法创建容器的问题排查思路与解决办法 记一次线上GoLang项目OOM排查过程 从LastPass转向拥抱开源KeePass的心路历程 故障定位与 AI 结合前后端编码实践 FileBeat收集nginx-ingress-controller日志 K8s云原生环境下文件描述符占用过高查询思路 2024年最新关闭火绒安全工具的开机自启方法 Kubernetes任务调度实践-Go语言实现Job和CronJob对比分析 离线更新k8s环境下的trivy漏洞库方法 使用Go语言接入Choerodon实现基于OAuth2的统一身份认证登录 在Vue2中自定义Switch组件并实现父子组件双向数据绑定 关于docker jdk1.8镜像中的GB18030-2022标准支持及验证 Go框架gin中的session存储gin-contrib-sessions和go-session 关于修改node_module中的源码问题记录 docker-compose网络和内网服务IP冲突问题 慎用存储过程:一条语句引发的数据库存储100%占用 Spring Boot中4种文件下载方法的实现 避坑-不能将specific类型的gitlab-runner改变为share类型 Docker compose中的MySQL主从复制模式和percona-toolkit工具使用 在minio中开启https访问以及使用rclone备份minio桶 在多机Docker环境下部署Choerodon的解决方案 Prometheus中Monitor添加对SpringBoot Actuator的Basic认证 在Nginx的容器镜像中隐藏Nginx的Server响应头 K8s中的两种nginx-ingress-controller及其区别 两个docker工具:runlike和whaler Grafana中的邮件报警和截图插件grafana-image-enderer K8s中externalName-service和services-without-selectors maven配置文件settings.xml中的一些概念总结 K8s中flexvolume插件驱动的安装 K8s中的coredns无法解析svc问题排查
利用git命令和java文件流 获取自己改动过的文件
ycyin · 2020-11-24 · via 小松鼠的博客

2020年11月24日大约 2 分钟GitGit使用技巧


需求描述

   获取项目中自己修改过的文件名,要求包含文件路径,相同目录下的文件可使用 路径 (文件1、文件2)格式表示,形成汇总文件。如下:

src/main/java/com/yyc/yyclady/actions/filter/  (IPValidateFilter.java)
src/main/java/com/yyc/yyclady/actions/transfermodel/  (LadyServiceParas.java)
src/main/java/com/yyc/yyclady/abc/dao/  (UserDAO.java、DAOParas.java、StatementDAO.java)
src/main/java/com/yyc/yyclady/abc/dao/model/  (UserPO.java、StatementPO.java)

处理

  基本思路:先使用git命令将自己修改过的文件路径包括文件名获取到,然后使用Java处理文件.

使用git命令获取自己改动过的文件

使用如下命令(使用 | clip可以直接将结果拷贝到剪贴板):

git show commit1..commit2 --author=--pretty= --name-only  | clip
# git show c93cb213..6b3234f3 --author=yyc --pretty= --name-only | clip

处理结果 将其转换为我们想要的格式

将git获取到的内容(所有commit涉及到的文件绝对路径名,一行一个)放到src.txt文件中,然后用Java流读取,可利用Set的特性去除重复的内容(因为是根据commit记录来获取的文件名,肯定有多次commit修改了同样的文件,所以是有重复的).然后使用正则表达式匹配文件路径和文件名,将其转换为我们需要的格式.

源文件(src.txt):

src
src

处理结果(out.txt):

out
out

处理过程完整代码如下:

import java.io.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

    private static Pattern URL_PATTERN = Pattern.compile("([a-zA-z]+/)*");

    private static Pattern FILE_NAME_PATTERN = Pattern.compile("[a-zA-z]*[.](xml|java|xls|properties)");

    public static void main(String[] args) throws IOException {
        FileInputStream filestream=new FileInputStream("C:\\Users\\yyc\\Desktop\\src.txt");
        InputStreamReader readStream=new InputStreamReader(filestream,"UTF-8");
        BufferedReader reader=new BufferedReader(readStream);

        File fout = new File("C:\\Users\\yyc\\Desktop\\out.txt");
        FileOutputStream fos = new FileOutputStream(fout);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));

        // 使用Set去重
        String temp=null;
        Set<String> fileNames = new TreeSet<>();
        while((temp=reader.readLine())!=null){
            fileNames.add(temp);
        }

        // 遍历Set 处理文件路径和文件名 处理后放入map  将文件路径作为map的key,文件名作为map的value
        Iterator<String> iterator = fileNames.iterator();
        Map<String, String> map = new TreeMap<>();
        while (iterator.hasNext()){
            String next = iterator.next();
                // 匹配文件路径
                Matcher matcher = URL_PATTERN.matcher(next);
                // 匹配文件名
                Matcher matcher2 = FILE_NAME_PATTERN.matcher(next);
                if (matcher.find() && matcher2.find()) {
                    String group = matcher.group(0);
                    String group1 = matcher2.group(0);
                    // 如果有这个key,就追加
                    if (map.containsKey(group)){
                        map.put(group,map.get(group)+"、"+group1);
                    }else{
                        // 没有就新加入
                        map.put(group,group1);
                    }
                }
        }

        // 遍历map 将内容输出到文件
        Set<Map.Entry<String, String>> entries = map.entrySet();
        entries.stream().forEach(entry ->{
            try {
                bw.write(entry.getKey()+"  ("+entry.getValue()+")");
                bw.newLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
        });

        bw.close();
        fos.close();
    }
}

参考

  1. git 有什么办法可以比对任意两次提交中一个作者修改了哪些文件吗? - V2EX