JGit的常用功能(提交、回滚,日志查询)
最近项目中要做一个回滚功能,目的是如果这次发布出现了问题,立马回滚到上一次发布的版本,用jgit实现的,具体方法如下:
public class GitUtil { private final static String GIT = ".git"; /** * 将文件列表提交到git仓库中 * @param gitRoot git仓库目录 * @param files 需要提交的文件列表 * @return 返回本次提交的版本号 * @throws IOException */ public static String commitToGitRepository(String gitRoot, List<String> files) throws Exception { if (StringUtils.isNotBlank(gitRoot) && files != null && files.size() > 0) { File rootDir = new File(gitRoot); //初始化git仓库 if (new File(gitRoot + File.separator + GIT).exists() == false) { Git.init().setDirectory(rootDir).call(); } //打开git仓库 Git git = Git.open(rootDir); //判断是否有被修改过的文件 List<DiffEntry> diffEntries = git.diff() .setPathFilter(PathFilterGroup.createFromStrings(files)) .setShowNameAndStatusOnly(true).call(); if (diffEntries == null || diffEntries.size() == 0) { throw new Exception("提交的文件内容都没有被修改,不能提交"); } //被修改过的文件 List<String> updateFiles=new ArrayList<String>(); ChangeType changeType; for(DiffEntry entry : diffEntries){ changeType = entry.getChangeType(); switch (changeType) { case ADD: updateFiles.add(entry.getNewPath()); break; case COPY: updateFiles.add(entry.getNewPath()); break; case DELETE: updateFiles.add(entry.getOldPath()); break; case MODIFY: updateFiles.add(entry.getOldPath()); break; case RENAME: updateFiles.add(entry.getNewPath()); break; } } //将文件提交到git仓库中,并返回本次提交的版本号 AddCommand addCmd = git.add(); for (String file : updateFiles) { addCmd.addFilepattern(file); } addCmd.call(); CommitCommand commitCmd = git.commit(); for (String file : updateFiles) { commitCmd.setOnly(file); } RevCommit revCommit = commitCmd.setCommitter(Constants.USERNAME, Constants.EMAIL) .setMessage("publish").call(); return revCommit.getName(); } return null; } /** * 将git仓库内容回滚到指定版本的上一个版本 * @param gitRoot 仓库目录 * @param revision 指定的版本号 * @return true,回滚成功,否则flase * @throws IOException */ public static boolean rollBackPreRevision(String gitRoot, String revision) throws IOException { Git git = Git.open(new File(gitRoot)); Repository repository = git.getRepository(); RevWalk walk = new RevWalk(repository); ObjectId objId = repository.resolve(revision); RevCommit revCommit = walk.parseCommit(objId); String preVision = revCommit.getParent(0).getName(); git.reset().setMode(ResetType.HARD).setRef(preVision).call(); repository.close(); return true; } /** * 查询本次提交的日志 * @param gitRoot git仓库 * @param revision 版本号 * @return * @throws Exception */ public static List<DiffEntry> getLog(String gitRoot, String revision) throws Exception { Git git = Git.open(new File(gitRoot)); Repository repository = git.getRepository(); ObjectId objId = repository.resolve(revision); Iterable<RevCommit> allCommitsLater = git.log().add(objId).call(); Iterator<RevCommit> iter = allCommitsLater.iterator(); RevCommit commit = iter.next(); TreeWalk tw = new TreeWalk(repository); tw.addTree(commit.getTree()); commit = iter.next(); if (commit != null) tw.addTree(commit.getTree()); else return null; tw.setRecursive(true); RenameDetector rd = new RenameDetector(repository); rd.addAll(DiffEntry.scan(tw)); return rd.compute(); } }
也是刚接触jgit不久,可能里面有些bug,若发现,请指出,谢谢!!
相关推荐
formula 2020-11-12
huhongfei 2020-11-05
乾坤一碼農 2020-10-27
liumengyanysu 2020-10-22
E哥的aws认证攻略 2020-10-15
tianyafengxin 2020-10-08
guying 2020-10-05
好脑筋不如烂笔头 2020-09-17
nebulali 2020-09-11
佛系程序员J 2020-09-15
fenggit 2020-09-15
JustHaveTry 2020-09-11
兄dei努力赚钱吧 2020-09-06
IngeniousIT 2020-08-25
liumengyanysu 2020-08-17
guying 2020-08-16