文章目录
1.jgit是什么?
如果你想在一个 Java 程序中使用 Git ,有一个功能齐全的 Git 库,那就是 JGit 。 JGit 是一个用 Java 写成的功能相对健全的 Git 的实现,它在 Java 社区中被广泛使用。
2、废话不多说,直接上代码
1.首先我应该计算出两个日期中间所有的月份,直接给你们一个工具类
public static List<String> getMonthBetweenDate(String startTime, String endTime){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
// 声明保存日期集合
List<String> list = new ArrayList<String>();
try {
// 转化成日期类型
Date startDate = sdf.parse(startTime);
Date endDate = sdf.parse(endTime);
//用Calendar 进行日期比较判断
Calendar calendar = Calendar.getInstance();
while (startDate.getTime()<=endDate.getTime()){
// 把日期添加到集合
list.add(sdf.format(startDate));
// 设置日期
calendar.setTime(startDate);
//把日期增加一天
calendar.add(Calendar.MONTH, 1);
// 获取增加后的日期
startDate=calendar.getTime();
}
} catch (ParseException e) {
e.printStackTrace();
}
return list;
}
3.上demo,这里需要先将远程的git clone到本地,然后注释起来,直接打开就行了
// Git git = Git.cloneRepository()
// .setURI( "http://gitlab.mintrust.res/trust/trust-coding.git" )
// .setDirectory( new File("/Users/candy/IdeaProjects/trust-coding/jgit/repo2") )
// .setBranch("yx-live-0822")
// .setCredentialsProvider(new UsernamePasswordCredentialsProvider("jian.wang","password@123"))
// .call();
//某个人在某月份提交的代码数量
Git git = Git.open(new File("/Users/candy/IdeaProjects/trust-coding/jgit/repo2"));
Repository repository = git.getRepository();
try( RevWalk revWalk = new RevWalk( repository ) ) {
ObjectId commitId = repository.resolve( "c9879cacdddb45bd8505cfe46c364a40e041d8f4" ); //这里是提交id,通过git log命令可以查看最近一次提交的commitId
revWalk.markStart( revWalk.parseCommit( commitId ) );
int i = 0;
for( RevCommit commit : revWalk ) {
if (commit.getAuthorIdent().getWhen().getTime() < strToDate("2022-07-20 12:00:00").getTime()){
continue;
}
RevCommit parent = null;
if (commit.getParent(0) != null) {
parent = revWalk.parseCommit(commit.getParent(0).getId());
}
DiffFormatter df = new DiffFormatter(DisabledOutputStream.INSTANCE);
df.setRepository(repository);
//设置比较器忽略空白字符
df.setDiffComparator(RawTextComparator.WS_IGNORE_ALL);
df.setDetectRenames(true);
List<DiffEntry> diffs = df.scan(parent.getTree(), commit.getTree());
for (DiffEntry diff : diffs) {
// df.format(diff);
FileHeader fileHeader = df.toFileHeader(diff);
List<? extends HunkHeader> hunks = fileHeader.getHunks();
int addSize = 0;
int subSize = 0;
for (HunkHeader hunk : hunks) {
EditList edits = hunk.toEditList();
for (Edit edit : edits) {
addSize += edit.getEndB() - edit.getBeginB();
subSize += edit.getEndA() - edit.getBeginA();
}
}
System.out.println("-----changeType=" + diff.getChangeType().name() + "----------新增的行数:"+ addSize + "-------删减的行数:" + subSize
+" -----改变的路径:" + diff.getNewPath() + "------改变的文件数:" +diffs.size());
}
i++;
System.out.println( "一共提交了"+i+"次;"+"------提交注释为:"+commit.getFullMessage()+"-----提交时间为:"+ dateToStr(commit.getAuthorIdent().getWhen())
+ "----提交人:"+ commit.getAuthorIdent().getName());
}
}